web-dev-qa-db-ja.com

Rails:ハッシュの配列から要素を削除する

次の配列があります:

 array = [{"email"=>"[email protected]", "name"=>"Test"},
          {"email"=>"[email protected]", "name"=>"Test A"},
          {"name"=>"Test B", "email"=>"[email protected]"},
          {"email"=>"[email protected]", "name"=>"Test C"},
          {"name"=>"Test D", "email"=>"[email protected]"},
          {"email"=>"[email protected]"},
          {"name"=>"Test F", "email"=>"[email protected]"}]

たとえば、「ブラックリスト」のメールのリストがあります。

 blacklist = ["[email protected]"]

私はこのようなことをしたいです:

 array - blacklist 
 # => should remove element {"email"=>"[email protected]", "name"=>"Test C"} 

確かに、.selectか何かでこれを行うためのセクシーなRubyの方法がありますが、私はそれを理解することができませんでした。私はこれを無駄に試しました:

 array.select {|k,v| v != "[email protected]"} # => returns array without any changes
23
MorningHacker

私はあなたがこれを探していると思います:

filtered_array = array.reject { |h| blacklist.include? h['email'] }

または select の代わりに reject を使用したい場合(おそらく、誰かの感情を傷つけたくないでしょう):

filtered_array = array.select { |h| !blacklist.include? h['email'] }

きみの

array.select {|k,v| ...

配列はEnumerableが単一の要素をブロックし、その場合、その要素はハッシュ(|k,v|トリックは、arrayに要素として2つの要素配列がある場合に機能します。

51
mu is too short

いかがですか

array.delete_if {|key, value| value == "[email protected]" }