在哈希数组

时间:2016-05-05 14:04:34

标签: arrays ruby-on-rails-4 hash

我正在寻找一种方法,只从多个哈希数组中选择重复的条目。

假设我有一个名为“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"]

2 个答案:

答案 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"]

这可以帮助你..