我已经读过一些关于使用块进行哈希合并的内容,这对于纯红宝石中简单,非嵌套的哈希来说效果很好。以下代码将按预期生成{1=>2, 2=>4, 4=>6}
:
a = {1 => 1, 2 => 2, 4 => 3}
b = {1 => 1, 2 => 2, 4 => 3}
a.merge(b) { |key, value_a, value_b | value_a + value_b }
但是合并不适用于嵌套哈希结构,我得到了NoMethodError (undefined method '+' for {1=>1, 2=>2}:Hash)
a = { "2018" => {1 => 1, 2 => 2, 4 => 3} }
b = { "2019" => {1 => 1, 2 => 2, 4 => 3} }
c = a.merge(b) { |key, value_a, value_b | value_a + value_b }
我看过的 each_with_object 的,而且我不确定如何使用它。有一种聪明的方法来完成子哈希值的合并吗?您认为最简单的方法是什么?
答案 0 :(得分:3)
您可以使用有效支持中的Hash#deep_merge来完成此操作。
require 'active_support/all'
a = { k1: { k2: 1 } }
b = { k1: { k2: 2 } }
a.deep_merge(b) { |k, v1, v2| v1 + v2 }
# => { l1: { k2: 3 } }
答案 1 :(得分:1)
嵌套Hash
,嵌套Hash#merge
?
我将b
的密钥更改为"2018"
a = { "2018" => {1 => 1, 2 => 2, 4 => 3} }
b = { "2018" => {1 => 1, 2 => 2, 4 => 3} }
c = a.merge(b) { |k, v1, v2| v1.merge(v2) { |kk, aa, bb | aa + bb } }
#=> {"2018"=>{1=>2, 2=>4, 4=>6}}
对于您的原始值:
a = { "2018" => {1 => 1, 2 => 2, 4 => 3} }
b = { "2019" => {1 => 1, 2 => 2, 4 => 3} }
结果是
#=> {"2018"=>{1=>1, 2=>2, 4=>3}, "2019"=>{1=>1, 2=>2, 4=>3}}