我正在使用Ruby on Rails 3.2.13,我想删除相应哈希值为空的哈希密钥。也就是说,如果我有以下哈希
{ :a => 0, :b => 1, :c => true, :d => "", :e => " ", :f => nil }
然后生成的哈希应该是(注意:0
和true
不被视为空白)
{ :a => 0, :b => 1, :c => true }
我该怎么做?
答案 0 :(得分:22)
如果使用Rails,您可以尝试
hash.delete_if { |key, value| value.blank? }
或仅仅是Ruby
hash.delete_if { |key, value| value.to_s.strip == '' }
答案 1 :(得分:6)
有很多方法可以完成这项常见任务
这是我经常使用的用于清理哈希的哈希,因为它简短,干净且足够灵活,足以支持任何条件和不会改变原始对象。这是关于红宝石不变性的好处的good article。
hash.reject {|_,v| v.blank?}
注意:上面示例中的下划线用于表示我们要解包传递给proc的元组,但我们没有使用第一个值(键)。
但是,如果你想改变原始对象:
hash.reject! {|_,v| v.blank?}
相反,您使用select,它只返回在评估时返回true的值
hash.select {|_,v| v.present? }
......和变异版
hash.select {|_,v| v.present? }
最后,当您 时 需要删除具有nil
值的密钥...
hash.compact
您现在已经选择了模式,但这是修改原始哈希的版本!
hash.compact!
答案 2 :(得分:0)
关于techvineet的解决方案,请在value == []时注意以下内容。
[].blank? => true
[].to_s.strip == '' => false
[].to_s.strip.empty? => false