2014-07-23 93 views
4

我有两个我想合并的哈希。他们是这样的:rails/ruby​​合并两个具有相同键的哈希,不同的值

[{"Hello"->"3"},{"Hi"->"43"},{"Hola"->"43"}] 

和第二散列的样子:

[{"Hello"->"4"},{"Hi"->"2"},{"Bonjour"->"2"}] 

我想,这样的结果看起来像合并这两个哈希数组:

[{"Hello"->[{value1=>3},{value2=>4}],{"Hi"->[{value1=>43},{value2=>2}]},{"Bonjour"->[{value1=>0},{value2=>2}]},{"Hola"->[{value1=>43},{value2=>0}]] 

是有一种简单的方法来合并这两个散列,或者我必须单独遍历散列并在其他散列中找到该关键字?

+0

[可能的重复](http://stackoverflow.com/questions/8415240/merge-ruby-hash) – 030

+0

这不完全是w你可以尝试使用'group_by':'{“Hello”=> [{“Hello”=>“3”},{“Hello”=>“4”}],“Hi”=> {“Hi”=>“43”},{“Hi”=>“2”}],“Hola”=> [{“Hola”=>“43”}],“Bonjour”=> [{“Bonjour “=>”2“}]}' – fbonetti

+2

'value1'和'value2'是什么? – sawa

回答

10

最简单的方法是把散列的阵列散列:

h1 = a1.reduce(&:merge) 
# => {"Hello"=>"3", "Hi"=>"43", "Hola"=>"43"} 
h2 = a2.reduce(&:merge) 
# => {"Hello"=>"4", "Hi"=>"2", "Bonjour"=>"2"} 

然后,你需要找到所有的键:

keys = [h1, h2].flat_map(&:keys).uniq 
# => ["Hello", "Hi", "Hola", "Bonjour"] 

接下来,针对每一个琴键,构建值的数组:

keys.map do |k| 
    {k => [{value1: h1[k] || "0"}, 
     {value2: h2[k] || "0"}]} 
end 
# => [{"Hello"=>[{:value1=>"3"}, {:value2=>"4"}]}, 
#  {"Hi"=>[{:value1=>"43"}, {:value2=>"2"}]}, 
#  {"Hola"=>[{:value1=>"43"}, {:value2=>"0"}]}, 
#  {"Bonjour"=>[{:value1=>"0"}, {:value2=>"2"}]}] 
相关问题