Rails/Ruby: 合并两个具有相同键但不同值的哈希表

4

我有两个哈希表需要合并,它们的样子如下:

[{"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}]]

有没有一种简单的方法可以合并这两个哈希表,还是我必须逐个迭代哈希表,并在另一个哈希表中查找该键?

可能重复 (https://dev59.com/n2oy5IYBdhLWcg3wo_no) - 030
这可能不是你想要的,但你可以尝试使用 group_by{"Hello"=>[{"Hello"=>"3"}, {"Hello"=>"4"}], "Hi"=>[{"Hi"=>"43"}, {"Hi"=>"2"}], "Hola"=>[{"Hola"=>"43"}], "Bonjour"=>[{"Bonjour"=>"2"}]} - fbonetti
2
value1value2是什么? - sawa
1个回答

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"}]}]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接