我正在使用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? }
或在案件刚刚红宝石
hash.delete_if { |key, value| value.to_s.strip == '' }
'value.to_s.strip.empty?'读取比'=='''好一点,IMO。另外,你不需要Rails有'空白',只需要ActiveSupport。 –
如果值是一个空的散列,该怎么办?或者进一步嵌套散列是空的? –
有许多的方法来完成这一共同任务
这是我最常用来清理哈希的一种,因为它的短小,干净和灵活以支持任何有条件的和不会改变原始对象。这里有一个good article关于红宝石不变性的好处。
hash.reject {|_,v| v.blank?}
注:在上面的例子中的下划线是用来表示我们要解包传递给PROC元组,但我们不使用的第一个值(键)。
但是,如果你想变异原始对象:
hash.reject! {|_,v| v.blank?}
相反,使用select评估
hash.select {|_,v| v.present? }
...和变异版本
hash.select {|_,v| v.present? }
最后,当你只需要删除具有nil
值的键...
hash.compact
你已经拿起了现在的模式,但这是修改原始散列的版本!
hash.compact!
关于techvineet的解决方案,请注意下面的值== []。
[].blank? => true
[].to_s.strip == '' => false
[].to_s.strip.empty? => false
你想保留':g => []'和'h => {}'吗? –