2013-10-02 37 views
9

Ruby on Rails 3.2.13 kullanıyorum ve hash değerinin boş olduğu hash anahtarlarını kaldırmak istiyorum. Hash değerleri hangi karma değeri boş bırakılır?

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

Bunu nasıl yapabiliriz: Ben sonra aşağıdaki karma

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

varsa çıkan sağlama (0 ve true boş olarak kabul edilmemektedir) gerektiğini, nedir? Eğer

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

veya davayı deneyebilirsiniz kullanarak Raylar ise

+0

Eğer' saklamak istiyor musunuz? –

cevap

22

sadece Yakut

reddetmek bu ortak görevi başarmak için çeşitli yolları vardır

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

'value.to_s.strip.empty?', '== ''', IMO'dan biraz daha iyi okur. Ayrıca, 'boş' olması için Rails'e ihtiyacınız yok, sadece ActiveSupport. –

+0

Eğer değer boş olan bir karma ise? veya daha fazla yuvalanmış hash boş mu? –

1

Kısa, temiz ve yeterince esnek olduğu için karmaları temizlemek için en sık kullandığım budur Koşulları desteklemek ve , özgün nesneyi değiştirmez. Yakutta değişmezlik yararları hakkında bir good article.

hash.reject {|_,v| v.blank?} 

Not: yukarıdaki örnekte çizgi, biz proc geçirilen tuple açmak isteyen belirtmek için kullanılır, fakat birinci değeri (anahtar) kullanılarak değildir.

reddet! Orijinal nesneyi mutasyona istiyorsanız

Ancak:

hash.reject! {|_,v| v.blank?} 

Tersine,

hash.select {|_,v| v.present? } 

değerlendirildiğinde tek gerçek dönmek değerleri dönecektir hangi seçme kullanmak seçmek seçin!

... ve mutasyona sürümü sadece nil değerlere sahip anahtarlarını kaldırmak gerekir

hash.select {|_,v| v.present? } 

kompakt

Son olarak, ...

hash.compact 

kompakt!

Deseni şimdi aldınız, ancak bu orijinal karmayı değiştiren sürümdür!

hash.compact! 
0

Techvineet'in çözümü ile ilgili olarak, değer == [] olduğunda aşağıdakilere dikkat edin.g => [] `ve` h ​​=> {} `:

[].blank?    => true 
[].to_s.strip == ''  => false 
[].to_s.strip.empty? => false