2011-10-22 13 views
23

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 

答えて

51

私はあなたがこのために探していると思う:

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が1つの要素をブロックし、この要素がこの場合ハッシュになるため、のトリックはarray要素が2つの要素配列を持つ場合に機能します。

+0

華麗!本当に、あなたはすばやく答えて、私はSOのシステムで答えを "受け入れる"ことすらできません。 – MorningHacker

+1

また、除外機能もあります!include –

+0

@ダーレン:唯一の欠点は、[除外?](http://api.rubyonrails.org/classes/Enumerable.html#method-i- exclude-3F)はRails拡張であり、それは二重否定的な領域につながります:)私はおそらく、 'reject' /' include? 'を使うでしょう。 @muに似た –

2

どの程度

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

が短すぎますが、 'select'は' array.delete_if {| hash |ハッシュ["email"] == "[email protected]"} ' – PeterWong

+0

delete_ifはインプレース(通常は良い考えではありません)で動作しますが、OPは新しい配列を必要としているようです。 – tokland

関連する問題