18

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

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

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

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

我怎样才能做到这一点?

4

3 回答 3

31

如果使用 Rails,您可以尝试

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

或者只是 Ruby

hash.delete_if { |key, value| value.to_s.strip == '' }
于 2013-10-02T23:57:42.793 回答
14

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

拒绝

这是我最常用于清理哈希的一种,因为它简短、干净且足够灵活,可以支持任何条件并且不会改变原始对象。这是一篇关于 ruby​​ 中不变性的好处的好文章

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!
于 2017-06-07T04:24:59.827 回答
0

关于techvineet的解决方案,当value == []时注意以下几点。

[].blank?               => true 
[].to_s.strip == ''     => false 
[].to_s.strip.empty?    => false
于 2017-07-31T13:31:24.467 回答