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

use*_*052 14 ruby hash ruby-on-rails key-value ruby-on-rails-3

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

{ :a => 0, :b => 1, :c => true, :d => "", :e => "   ", :f => nil }
Run Code Online (Sandbox Code Playgroud)

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

{ :a => 0, :b => 1, :c => true }
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

tec*_*eet 23

如果使用Rails,你可以试试

hash.delete_if { |key, value| value.blank? }
Run Code Online (Sandbox Code Playgroud)

或者只是Ruby

hash.delete_if { |key, value| value.to_s.strip == '' }
Run Code Online (Sandbox Code Playgroud)

  • `value.to_s.strip.empty?`读取比`==''`,IMO好一点.另外,你不需要Rails有"空白",只需要ActiveSupport. (3认同)

Wil*_*ant 7

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

拒绝

这是我经常使用的用于清理哈希的哈希,因为它简短,干净且足够灵活,可以支持任何条件并且不会改变原始对象.这是一篇关于红宝石不变性的好处的文章.

hash.reject {|_,v| v.blank?}
Run Code Online (Sandbox Code Playgroud)

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

拒绝!

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

hash.reject! {|_,v| v.blank?}
Run Code Online (Sandbox Code Playgroud)

选择

相反,您使用select,它将仅返回在计算时返回true的值

hash.select {|_,v| v.present? }
Run Code Online (Sandbox Code Playgroud)

选择!

......和变异版本

hash.select {|_,v| v.present? }
Run Code Online (Sandbox Code Playgroud)

紧凑

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

hash.compact
Run Code Online (Sandbox Code Playgroud)

紧凑!

您现在已经选择了模式,但这是修改原始哈希的版本!

hash.compact!
Run Code Online (Sandbox Code Playgroud)