2011-10-22 14 views
23

Mam następującą tablicę:Szyny: Usuwanie elementu z tablicy skrótów

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]"}] 

Mam listę „czarnej listy” e-maile, na przykład:

blacklist = ["[email protected]"] 

chcę zrobić coś jak to:

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

pewno nie jest sposobem sexy-Ruby to zrobić z .Wybrać czy coś, ale nie byłem w stanie zrozumieć. Próbowałem to bezskutecznie:

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

Odpowiedz

51

myślę szukasz to:

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

lub jeśli chcesz używać select zamiast reject (być może nie chcesz nikogo skrzywdzić to uczucia):

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

Twój

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

próba nie zadziała, ponieważ tablica rozdaje Enumerable blokuje pojedynczy element, a ten element będzie hasłem w tym przypadku, sztuczka |k,v| zadziała, jeśli array ma dwie tablice elementów jako elementy.

+0

genialny! dzięki za szybki zwrot :) w rzeczywistości odpowiedziałeś tak szybko, że nie mogę nawet "przyjąć" odpowiedzi na system SO. – MorningHacker

+1

jest także funkcja wykluczająca, która jest i jest aliasem dla! Include –

+0

@Darren: Jedynym minusem jest to, że ["wyklucz"?] (Http://api.rubyonrails.org/classes/Enumerable.html#method-i- exclude-3F) jest rozszerzeniem Rails, które prowadzi do podwójnego negatywnego terytorium :) Prawdopodobnie użyłbym 'reject' /' include? '. –

2

Jak o

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

podobne do @mu jest zbyt krótkim 'select', powinno być' tablica.delete_if {| hash | hash ["email"] == "[email protected]"} ' – PeterWong

+0

delete_if działa w miejscu (zazwyczaj nie jest to dobry pomysł), OP wydaje się chcieć nowej tablicy. – tokland