比较数组中的值并删除 Ruby/Rails 中不同的项目
Posted
技术标签:
【中文标题】比较数组中的值并删除 Ruby/Rails 中不同的项目【英文标题】:Compare values in array and remove items that are not the same in Ruby/Rails 【发布时间】:2022-01-16 19:01:24 【问题描述】:我的表单发送了一组项目/值。 我想比较每个项目的值,只有当值不同时才删除/匹配项目。我在代码中添加了一些 cmets 来提供帮助。
temp_array = []
# remove/match duplicate drinks with different values
params[:drinks].values.each do |v|
# get drink id
drink_id = v[:id]
# store values in temp_array
temp_array << v
# if the values below are NOT the same for the SAME drink_id
# store them in a new array to perform task on them
v[:optimized_nickname], v[:optimized_country_id], v[:optimized_region_id]
# ...
# compare values to values set in temp_array for same drink_id
end
目标是使用 status=0
为相同的饮料/drink_id 标记具有不同值(至少 1 个不同值)的所有饮料。
我需要/想要检查不同的值,而不是使用表单发送的所有值。
我很确定 .map 或 .filter 存在一个简单的解决方案,但我很难使用它们。 提前致谢,
编辑:根据要求,我想要一个示例:
# the form sends this, first and third drinks have same id wbut different values
"drinks"=>
"season_id_a9840059-cc91-47aa-9098-4bf8a45655e7"=>"id"=>"f00b5b20-0250-4e0d-8a05-c70905030a32", "optimized_nickname"=>"La Dame", "optimized_country_id"=>"1", "optimized_region_id"=>"2",
"season_id_8ee93dc5-abd3-4cdd-ad20-29fcf1168a66"=>"id"=>"de034565-0250-4e0d-8a05-c70905030a32", "optimized_nickname"=>"La Dame", "optimized_country_id"=>"1", "optimized_region_id"=>"2",
"season_id_f00b5b20-0250-4e0d-8a05-c70905030a32"=>"id"=>"f00b5b20-0250-4e0d-8a05-c70905030a32", "optimized_nickname"=>"L'homme", "optimized_country_id"=>"1", "optimized_region_id"=>"2",
# I want to keep the second drink
# drinks OK => STATUS 1
"drinks_OK"=>
"season_id_8ee93dc5-abd3-4cdd-ad20-29fcf1168a66"=>"id"=>"de034565-0250-4e0d-8a05-c70905030a32", "optimized_nickname"=>"La Dame", "optimized_country_id"=>"1", "optimized_region_id"=>"2",
# I want to remove/edit the first and third with an update
# drinks KO => STATUS 0
"drinks_KO"=>
"season_id_a9840059-cc91-47aa-9098-4bf8a45655e7"=>"id"=>"f00b5b20-0250-4e0d-8a05-c70905030a32", "optimized_nickname"=>"La Dame", "optimized_country_id"=>"1", "optimized_region_id"=>"2",
"season_id_f00b5b20-0250-4e0d-8a05-c70905030a32"=>"id"=>"f00b5b20-0250-4e0d-8a05-c70905030a32", "optimized_nickname"=>"L'homme", "optimized_country_id"=>"1", "optimized_region_id"=>"2",
【问题讨论】:
你能举一个输入和预期输出的例子吗? 我觉得你可以试试params[:drinks].values.group_by |v| v[:id].transform_values(&:uniq)
BroiSatse,我添加了一个带有值的示例。
我想检查要比较的值,而不是使用所有值。 ;)
【参考方案1】:
你可以使用reject:
params[drinks].values.reject |i| i == v[:id]
将返回一个值不等于v[:id]
的数组
【讨论】:
mejiaro,我想,这不是我想做的。只有当同一种饮料的至少一个值不同时,我才想拒绝,这意味着我需要比较v[:optimized_nickname], v[:optimized_country_id]
...等
如果reject
的返回值为空,则表示您的值相同。如果它不为空,那么您将拥有不同的值,并且可以随心所欲地使用它们。以上是关于比较数组中的值并删除 Ruby/Rails 中不同的项目的主要内容,如果未能解决你的问题,请参考以下文章