在Ruby中我有一个二维哈希。在Ruby中从嵌套哈希中删除元素
h = { "a" => {"v1" => 0, "v2" => 1}, "c" => {"v1" => 2, "v2" => 3} }
我想删除从散列,其中值1(v1
)为0,例如那些元素,所以我的结果将是:
{ "c" => {"v1" => 2, "v2" => 3} }
我想通过迭代来实现这一通过散列与delete_if
,但我不知道如何处理与它嵌套的部分。
在Ruby中我有一个二维哈希。在Ruby中从嵌套哈希中删除元素
h = { "a" => {"v1" => 0, "v2" => 1}, "c" => {"v1" => 2, "v2" => 3} }
我想删除从散列,其中值1(v1
)为0,例如那些元素,所以我的结果将是:
{ "c" => {"v1" => 2, "v2" => 3} }
我想通过迭代来实现这一通过散列与delete_if
,但我不知道如何处理与它嵌套的部分。
这是你在找什么?
h.delete_if { |_, v| v['v1'].zero? }
#=> {"c" => {"v1" => 2, "v2" => 3}}
由于@TomLord说,这也可能是变型,当v1
可以没有定义或等于nil
,在这种情况下,这将是更好地使用v['v1'] == 0
中您可以使用您的Hash#value?
块检查嵌套哈希值的任何等于0
:
hash.delete_if { |k,v| v.value? 0 } #=> { "c" => { "v1" => 2, "v2" => 3 } }
OP似乎只关心子哈希中的'v1',所以如果'v1 == 1'和'v2 == 0'那么这个解决方案是不准确的 – engineersmnky
@engineersmnky真的,我只是添加了一些解释。我会留下答案,因为OP仍然可以找到它的用处。 –
将嵌套的哈希总是包含一个''v1''键,将它ALWA ys映射到'Numeric'对象?如果不是,使用'== 0'而不是'.zero?'会更安全。 –
@TomLord当然,你的权利 –