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

时间:2013-10-02 23:53:57

标签: ruby-on-rails ruby ruby-on-rails-3 hash key-value

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

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

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

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

我该怎么做?

3 个答案:

答案 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