2017-06-26 69 views
0

在Ruby中我有一个二维哈希。在Ruby中从嵌套哈希中删除元素

h = { "a" => {"v1" => 0, "v2" => 1}, "c" => {"v1" => 2, "v2" => 3} } 

我想删除从散列,其中值1(v1)为0,例如那些元素,所以我的结果将是:

{ "c" => {"v1" => 2, "v2" => 3} } 

我想通过迭代来实现这一通过散列与delete_if,但我不知道如何处理与它嵌套的部分。

回答

3

这是你在找什么?

h.delete_if { |_, v| v['v1'].zero? } 
#=> {"c" => {"v1" => 2, "v2" => 3}} 

由于@TomLord说,这也可能是变型,当v1可以没有定义或等于nil,在这种情况下,这将是更好地使用v['v1'] == 0

+2

将嵌套的哈希总是包含一个''v1''键,将它ALWA ys映射到'Numeric'对象?如果不是,使用'== 0'而不是'.zero?'会更安全。 –

+0

@TomLord当然,你的权利 –

1

中您可以使用您的Hash#value?块检查嵌套哈希值的任何等于0

hash.delete_if { |k,v| v.value? 0 } #=> { "c" => { "v1" => 2, "v2" => 3 } } 
+1

OP似乎只关心子哈希中的'v1',所以如果'v1 == 1'和'v2 == 0'那么这个解决方案是不准确的 – engineersmnky

+0

@engineersmnky真的,我只是添加了一些解释。我会留下答案,因为OP仍然可以找到它的用处。 –