如何合并在ruby中具有相同键的两个哈希

时间:2014-07-08 14:16:24

标签: ruby hash

我有两个哈希应该有相同的键,如:

a = {a: 1, b: 2, c: 3}
b = {a: 2, b: 3, c: 4}

我想总结这样的每个值:

if a.keys == b.keys
  a.values.zip(b.values).map{|a, b| a+b}
end

但是如果键的顺序与b = {a: 2, c: 4, b: 3}不同,则此代码不起作用。

如何在考虑密钥顺序的情况下编写代码?

2 个答案:

答案 0 :(得分:27)

使用Hash#mergeHash#merge!

a = {a: 1, b: 2, c: 3}
b = {a: 2, c: 4, b: 3}
a.merge!(b) { |k, o, n| o + n }
a # => {:a=>3, :b=>5, :c=>7}

使用键,旧值,新值调用块。并且块的返回值用作新值。

答案 1 :(得分:0)

如果您使用的活动支持(Rails)添加了Hash#transform_values,那么当您使用n哈希时,我真的很喜欢这个易于阅读的解决方案:

hashes = [hash_1, hash_2, hash_3] # any number of hashes
hashes.flat_map(&:to_a).group_by(&:first).transform_values { |x| x.sum(&:last) }