2013-10-02 73 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 
相關問題