如何合并两个散列而不丢失值

iro*_*and 2 ruby hash

我有两个这样的哈希值。

a = {foo: {first: 1}, bar: {first: 2}}
b = {foo: {second: 3}, bar: {second: 4}}
Run Code Online (Sandbox Code Playgroud)

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

{foo: {first: 1, second: 3}, bar: {first: 2, second: 4}}
Run Code Online (Sandbox Code Playgroud)

但是a.merge b回报{:foo=>{:second=>3}, :bar=>{:second=>4}}

如何合并两个散列而不丢失值?

bjh*_*aid 5

如果您的哈希格式始终看起来像您指定的格式,则可以使用以下代码:

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}}
Run Code Online (Sandbox Code Playgroud)

否则使用ActiveSupportdeep_merge!