我有两个像这样的哈希。
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}}
。
如何在不丢失值的情况下合并两个哈希?
答案 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)