我正在使用 Ruby on Rails 3.2.13,我想删除对应哈希值为空的哈希键。也就是说,如果我有以下哈希:
{ :a => 0, :b => 1, :c => true, :d => "", :e => " ", :f => nil }
那么生成的哈希值应该是(注意:0
和 true
不被视为空白)
{ :a => 0, :b => 1, :c => true }
我该怎么做呢?
我正在使用 Ruby on Rails 3.2.13,我想删除对应哈希值为空的哈希键。也就是说,如果我有以下哈希:
{ :a => 0, :b => 1, :c => true, :d => "", :e => " ", :f => nil }
那么生成的哈希值应该是(注意:0
和 true
不被视为空白)
{ :a => 0, :b => 1, :c => true }
我该怎么做呢?
如果使用Rails,您可以尝试
hash.delete_if { |key, value| value.blank? }
或者仅限于 Ruby 的情况下
hash.delete_if { |key, value| value.to_s.strip == '' }
value.to_s.strip.empty?
比== ''
更易读。此外,你不需要Rails就可以使用blank?
,只需ActiveSupport即可。 - Andrew Marshall有多种方法可以完成这个常见任务
这是我最常用的一种清理哈希表的方法,因为它短小精悍、足够灵活,支持任何条件,不会改变原始对象。这里有一篇关于Ruby中不可变性好处的好文章。
hash.reject {|_,v| v.blank?}
注意:上面例子中的下划线用于表示我们想要解包传递给 proc 的元组,但是我们不使用第一个值(key)。
但是,如果您想要改变原始对象:
hash.reject! {|_,v| v.blank?}
相反地,您使用select将仅返回当进行评估时返回true的值。
hash.select {|_,v| v.present? }
...以及可变版本。
hash.select {|_,v| v.present? }
最后,当您仅需要删除具有nil
值的键时...
hash.compact
现在你已经掌握了这个模式,但是这个版本修改了原始哈希值!
hash.compact!
[].blank? => true
[].to_s.strip == '' => false
[].to_s.strip.empty? => false
:g => []
和h => {}
吗? - Cary Swoveland