如何在不丢失值的情况下合并两个哈希值

时间:2014-05-05 02:57:49

标签: ruby hash

我有两个像这样的哈希。

a = {foo: {first: 1}, bar: {first: 2}}
b = {foo: {second: 3}, bar: {second: 4}}

我期待a.merge b这样的结果。

{foo: {first: 1, second: 3}, bar: {first: 2, second: 4}}

a.merge b会返回{:foo=>{:second=>3}, :bar=>{:second=>4}}

如何在不丢失值的情况下合并两个哈希?

2 个答案:

答案 0 :(得分:4)

如果您的哈希格式总是看起来像您指定的那样,则下面的方法可行:

a = {foo: {first: 1}, bar: {first: 2}}
b = {foo: {second: 3}, bar: {second: 4}}
a.each_with_object(b) { |(k,v),x| x[k].merge!(v) }
# => {:foo=>{:second=>3, :first=>1}, :bar=>{:second=>4, :first=>2}}

否则请使用ActiveSupport的{​​{3}}

答案 1 :(得分:0)

你应该使用Hash#merge的形式,它采用一个块来确定与两个哈希值中存在的每个键相关联的值。

<强>代码

def merge_em(a,b)    
  a.merge(b) { |k,va,vb| va.merge(vb) }
end

示例

a = {foo: {first:  1}, bar: {first:  2}}
b = {foo: {second: 3}, bar: {second: 4}}

merge_em(a,b)
  #=> {:foo=>{:first=>1, :second=>3}, :bar=>{:first=>2, :second=>4}}

<强>解释

这里的块变量如下:

`k` : the key
`va`: the value for key `k` in the merged hash (`a`)
`vb`: the value for key `k` in the hash being merged (`b`)

我们希望键k的值只是:

va.merge(vb)