hash.merge与块以添加子哈希键?

时间:2019-02-02 00:47:25

标签: ruby hash

我已经读过一些关于使用块进行哈希合并的内容,这对于纯红宝石中简单,非嵌套的哈希来说效果很好。以下代码将按预期生成{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 的,而且我不确定如何使用它。有一种聪明的方法来完成子哈希值的合并吗?您认为最简单的方法是什么?

2 个答案:

答案 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}}