hash.merge用块来添加子哈希键?

问题描述 投票:0回答:2

我已经阅读了一些关于与块的哈希合并的内容,这对于简单的非嵌套哈希在纯红宝石中工作正常。以下代码按预期生成{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的内容,我不确定如何使用它。有没有一种聪明的方法来完成子哈希值的合并?您认为最简单的方法是什么?

ruby hash
2个回答
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}}

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 } }
© www.soinside.com 2019 - 2024. All rights reserved.