如何删除哈希值为空的哈希键?

21

我正在使用 Ruby on Rails 3.2.13,我想删除对应哈希值为空的哈希键。也就是说,如果我有以下哈希:

{ :a => 0, :b => 1, :c => true, :d => "", :e => "   ", :f => nil }

那么生成的哈希值应该是(注意:0true 不被视为空白)

{ :a => 0, :b => 1, :c => true }

我该怎么做呢?


你想保留 :g => []h => {} 吗? - Cary Swoveland
3个回答

34

如果使用Rails,您可以尝试

hash.delete_if { |key, value| value.blank? }

或者仅限于 Ruby 的情况下

hash.delete_if { |key, value| value.to_s.strip == '' }

3
在我看来,value.to_s.strip.empty?== ''更易读。此外,你不需要Rails就可以使用blank?,只需ActiveSupport即可。 - Andrew Marshall
如果值是一个空的哈希表,或者进一步嵌套的哈希表为空呢? - Horse Voice

18

有多种方法可以完成这个常见任务

拒绝

这是我最常用的一种清理哈希表的方法,因为它短小精悍、足够灵活,支持任何条件,不会改变原始对象。这里有一篇关于Ruby中不可变性好处的好文章

hash.reject {|_,v| v.blank?}

注意:上面例子中的下划线用于表示我们想要解包传递给 proc 的元组,但是我们不使用第一个值(key)。

reject!

但是,如果您想要改变原始对象:

hash.reject! {|_,v| v.blank?}

选择

相反地,您使用select将仅返回当进行评估时返回true的值。

hash.select {|_,v| v.present? }

选择!

...以及可变版本。

hash.select {|_,v| v.present? }

紧凑

最后,当您需要删除具有nil值的键时...

hash.compact

简洁!

现在你已经掌握了这个模式,但是这个版本修改了原始哈希值!

hash.compact!

0
关于techvineet的解决方案,请注意当value == []时的以下内容。
[].blank?               => true 
[].to_s.strip == ''     => false 
[].to_s.strip.empty?    => false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接