web-dev-qa-db-ja.com

ハッシュ値が空白のハッシュキーを削除するにはどうすればよいですか?

Ruby on Rails 3.2.13を使用していて、対応するハッシュ値が空白のハッシュキーを削除したい。つまり、次の場合ハッシュ

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

その場合、結果のハッシュは次のようになります(注:0およびtrueは空白とは見なされません)

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

どうすればそれを作ることができますか?

14
user502052

Railsを使用している場合は、試すことができます

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

またはRubyだけの場合

hash.delete_if { |key, value| value.to_s.strip == '' }
25
techvineet

この一般的なタスクを実行する方法はいくつかあります

拒否する

これは、条件付きをサポートするのに十分短く、クリーンで、柔軟性があり、元のオブジェクトを変更しないため、ハッシュのクリーンアップに最も頻繁に使用するものです。 )。これが 良い記事 Rubyの不変性の利点についてです。

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

注:上記の例のアンダースコアは、procに渡されたタプルを解凍することを示すために使用されていますが、最初の値(キー)は使用していません。

拒否します!

ただし、元のオブジェクトを変更する場合は、次のようにします。

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

選択する

逆に、評価時にtrueを返す値のみを返すselectを使用します

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

選択する!

...そして変異バージョン

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

コンパクト

最後に、onlynil値を持つキーを削除する必要がある場合。 。

hash.compact

コンパクト!

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

hash.compact!
9
Will Bryant

Techvineetのソリューションに関して、value == []の場合は次の点に注意してください。

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