2010-02-11 60 views
191

Tengo una variedad de hashes, @fathers.¿Cómo busco dentro de una matriz de valores hash por valores de hash en ruby?

a_father = { "father" => "Bob", "age" => 40 } 
@fathers << a_father 
a_father = { "father" => "David", "age" => 32 } 
@fathers << a_father 
a_father = { "father" => "Batman", "age" => 50 } 
@fathers << a_father 

¿Cómo puedo buscar esta matriz y devolver una matriz de valores hash para los que un bloque devuelve verdadero?

Por ejemplo:

@fathers.some_method("age" > 35) #=> array containing the hashes of bob and batman 

Gracias.

Respuesta

346

Usted está buscando Enumerable#select (también llamado find_all):

@fathers.select {|father| father["age"] > 35 } 
# => [ { "age" => 40, "father" => "Bob" }, 
#  { "age" => 50, "father" => "Batman" } ] 

por la documentación, que "devuelve una matriz que contiene todos los elementos de [la enumerables, en este caso @fathers] para los que el bloque no es falso."

+12

Oh! ¡Tú fuiste el primero! Borrando mi respuesta y +1. –

+1

Excelente. ¡Muchas gracias! – doctororange

+13

Como nota, si solo quiere encontrar una sola (la primera) puede usar '@fathers.find {| father | padre ["edad"]> 35} 'en su lugar. –

165

esto devolverá primer partido

@fathers.detect {|f| f["age"] > 35 } 
+6

Prefiero esto sobre '# seleccionar' - Pero todo vale para tu caso de uso. '# detect' devolverá' nil' si no se encuentra una coincidencia, mientras que '# select', en la respuesta de @ Jordan, devolverá' [] '. –

+10

También podría usar 'find' en lugar de' detect' para obtener un código más legible –

+7

'find' puede ser confuso en los rieles, sin embargo. – user12341234

20

si la matriz se parece

array = [ 
{:name => "Hitesh" , :age => 27 , :place => "xyz"} , 
{:name => "John" , :age => 26 , :place => "xtz"} , 
{:name => "Anil" , :age => 26 , :place => "xsz"} 
] 

y desea saber si algún valor ya está presente en la matriz. Utilizar método Find

array.find {|x| x[:name] == "Hitesh"} 

Esto devolverá objeto si Hitesh está presente en nombre de lo contrario devuelve nil

Cuestiones relacionadas