2013-10-02 11 views
9

Ruby on Rails 3.2.13を使用していますが、対応するハッシュ値が空白のハッシュキーを削除したいと考えています。どのように私はそれを行うことができますハッシュ値が空白のハッシュキーを削除するにはどうすればよいですか?

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

:私は以下のハッシュ

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

を持っている場合、つまり、その結果のハッシュは(0trueが空白とみなされていないノート)すべきですか?

+0

は、あなたが'維持したいですか? –

答えて

22

のRailsを使用している場合、あなたは

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

か、単にRubyの

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?} 

は逆に

を選択すると、選択し使用

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

を評価した場合にのみtrueを返す値を返すなります選択!

...と変異バージョン

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

コンパクト

最後に、あなたがのみnil値を持つキーを削除する必要があります...

hash.compact 

コンパクト!

これまでにパターンを選択しましたが、これは元のハッシュを変更するバージョンです。

0

techvineetのソリューションに関しては、value == []のときは次の点に注意してください。グラム=> [] `と` H => {} `:

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