2011-10-22 10 views
23

Tengo la siguiente matriz:Rieles: Quitar elemento de la gama de valores hash

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

tengo una lista de correos electrónicos "lista negra", por ejemplo:

blacklist = ["[email protected]"] 

quiero hacer algo como esto:

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

Seguramente hay una manera atractiva-Rubí de hacer esto con .select o algo, pero no han sido capaces de averiguarlo. He intentado esto en vano:

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

Respuesta

51

Creo que estás buscando este:

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

o si desea utilizar select en lugar de reject (tal vez no quieren hacer daño a nadie es sentimientos):

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

Su

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

El intento no funcionará porque la matriz entrega los bloques Enumerable un solo elemento y ese elemento será un Hash en este caso, el truco |k,v| funcionaría si array tuviera dos conjuntos de elementos como elementos.

+0

brillante! gracias por el rápido cambio :) de hecho, respondiste tan rápido que ni siquiera puedo "aceptar" la respuesta en el sistema de SO. – MorningHacker

+1

también hay una función de exclusión que es y alias para! Include –

+0

@Darren: El único inconveniente es que ['exclude?'] (Http://api.rubyonrails.org/classes/Enumerable.html#method-i- exclude-3F) es una extensión de Rails y eso llevaría a un territorio doblemente negativo :) Probablemente iría con 'reject' /' include? '. –

2

¿Qué tal

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

similar a @mu es demasiado corto 'select', debería ser' array.delete_if {| hash | hash ["email"] == "[email protected]"} ' – PeterWong

+0

delete_if funciona in situ (generalmente no es una buena idea), el OP parece querer una nueva matriz. – tokland

Cuestiones relacionadas