2013-10-02 74 views
9

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

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

然后将得到的哈希值应为(注意:0true不被认为是空白)

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

我怎么能作出这样的?

+0

你想保留':g => []'和'h => {}'吗? –

回答

22

如果使用Rails,你可以尝试

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

或在案件刚刚红宝石

hash.delete_if { |key, value| value.to_s.strip == '' } 
+3

'value.to_s.strip.empty?'读取比'=='''好一点,IMO。另外,你不需要Rails有'空白',只需要ActiveSupport。 –

+0

如果值是一个空的散列,该怎么办?或者进一步嵌套散列是空的? –

1

有许多的方法来完成这一共同任务

拒绝

这是我最常用来清理哈希的一种,因为它的短小,干净和灵活以支持任何有条件的和不会改变原始对象。这里有一个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! 
0

关于techvineet的解决方案,请注意下面的值== []。

[].blank?    => true 
[].to_s.strip == ''  => false 
[].to_s.strip.empty? => false 
相关问题