我正在使用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 => {}'嗎? –