我正在寻找一种方法,只从多个哈希数组中选择重复的条目。
假设我有一个名为“exchange_rate”的项目:
project.exchange_rate #=>
[{"name"=>"USD", "rate"=>1.0},
{"name"=>"EUR", "rate"=>0.91},
{"name"=>"CNY", "rate"=>6.51},
{"name"=>"NOK", "rate"=>1},
{"name"=>"DKK", "rate"=>1},
{"name"=>"JPY", "rate"=>113.24}]
现在我有多个项目具有相同的构造,只是在Array中有更多/更少的条目。哈希中的“率”根本不重要。我只需要迭代所有项目及其exchange_rates,并找到每个数组中的条目。
可以这么说,如果我有以下项目_2:
project_2.exchange_rate #=>
[{"name"=>"USD", "rate"=>1.0},
{"name"=>"GBP", "rate"=>0.7},
{"name"=>"SGD", "rate"=>1.38},
{"name"=>"HKD", "rate"=>7.76},
{"name"=>"CNY", "rate"=>0.94},
{"name"=>"DE", "rate"=>0.86},
{"name"=>"JPY", "rate"=>113.24}]
在比较这两个条目之后,我想得到一个看起来像这样的数组:
# => ["USD", "CNY", "JPY"]
因为这两个名字都在这两个项目中。当然,这应该是动态的,适用于任何数量的项目和交换项目。
我似乎找不到这样做的方法。 我已经尝试了以下内容:
er = projects.map { |e| e[:exchange_rate] }.inject(:+)
founds = er.find_all { |x| er.count(x) > 1 }.uniq
但它提出了一个包含所有类型值的巨大数组,而不仅仅是重复数据。
TL; DR:
我需要遍历所有项目及其exchange_rates
我需要找到这些
我最终只需要这些
我有一个未知数量的项目以及绑定到每个项目的exchange_rate
非常感谢你!
我认为这不是我需要的,所以我改变了主意,做了不同的事情。 尽管如此,这个问题可能对其他人来说是可行的。如果您有答案,请继续发布:)
我的(完全偏离主题)结果:
names = projects.map{|p| p[:exchange_rates].map{|er| er["name"] } }
final = names.flatten.uniq
# from => [["USD", "EUR", "GBR"], [], ["MYR", "GBR"], ["USD"], ...]
# to ["USD", "EUR", "GBR", "MYR"]
答案 0 :(得分:2)
你可以简单地使用project_1.exchange_rate & project_2.exchange_rate
,它给你[{"name"=>"USD", "rate"=>1.0}, {"name"=>"JPY", "rate"=>113.24}]
,即来自两个数组中键和值匹配的数组的公共条目。
但是如果你只想找到两个数组中哈希键的常用元素,你可以试试这样的东西
project_1.exchange_rate.map {|e| e["name"]} &
project_2.exchange_rate.map {|e| e["name"]}
#=> ["USD", "CNY", "JPY"]
如果您有多个像您所说的阵列,请尝试以下方法:
def get_duplicate_keys(*rates)
all_rates = rates.inject([]) { |s, e| s + e }
temp = all_rates.group_by { |e| e["name"] }
temp.select { |k,v| v.count > 1 }.keys
end
r1 = [{"name"=>"USD", "rate"=>1.0},
{"name"=>"EUR", "rate"=>0.91},
{"name"=>"CNY", "rate"=>6.51},
{"name"=>"NOK", "rate"=>1},
{"name"=>"DKK", "rate"=>1},
{"name"=>"JPY", "rate"=>113.24}]
r2 = [{"name"=>"USD", "rate"=>1.0},
{"name"=>"GBP", "rate"=>0.7},
{"name"=>"SGD", "rate"=>1.38},
{"name"=>"HKD", "rate"=>7.76},
{"name"=>"CNY", "rate"=>0.94},
{"name"=>"DE", "rate"=>0.86},
{"name"=>"JPY", "rate"=>113.24}]
r3 = [{"name"=>"GBP", "rate"=>0.7},
{"name"=>"SGD", "rate"=>1.38}]
p get_duplicate_keys(r1 + r2 + r3)
#=> ["USD", "CNY", "JPY", "GBP", "SGD"]
答案 1 :(得分:0)
你可以尝试这个解决方案,
duplicates = project.exchange_rate & project_2.exchange_rate
然后
duplicates.map{|er| er["name"]}
返回结果
=> ["USD", "CNY", "JPY"]
或者您可以尝试以下解决方案.....
首先,您可以找到两个项目的名称数组
proj1_names = []
project.exchange_rates.each{ |er| proj1_names << er["name"] }
proj2_names = []
project_2.exchange_rates.each{ |er| proj2_names << er["name"]}
这给出了像
这样的结果proj1_names = ["USD","EUR","CNY","NOK","DKK","JPY"]
proj2_names = ["USD","GBP","SGD","HKD","CNY","DE","JPY"]
然后尝试以下方法
proj1_names.select{|name| proj2_names.include?(name)}
这会返回重复的名称
i.e => ["USD", "CNY", "JPY"]
这可以帮助你..