Tengo una matriz de hashes, @padres.

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 devuelve un array de hashes para que un bloque devuelve true?

Por ejemplo:

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

Gracias.

InformationsquelleAutor doctororange | 2010-02-11

3 Comentarios

  1. 393

    Estás buscando Enumerable#seleccione (también llamado find_all):

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

    Por la documentación, se «devuelve un array que contiene todos los elementos de [la enumerable, en este caso @fathers] para que el bloque no es falsa.»

    • Oh! Fuiste el primero! Eliminar mi respuesta y +1.
    • Excelente. Muchas gracias!
    • Como nota, si usted sólo tiene que encontrar un solo uno (el primero) puede utilizar @fathers.find {|father| father["age"] > 35 } lugar.
    • Es posible volver al índice de donde este se encuentra en la matriz original de hash?
    • Sí. Sugiero mirar la documentación para el módulo Enumerable. Si usted todavía no puede averiguar, publicar una nueva pregunta.
    • Yo solo hice este índice = ARRAY.index { | h | h[ :código ] == ARRAY[ «codigo» ] }
    • ¿cuál es la forma más rápida de encontrar usando el valor hash único, sin condición, la condición es father["unique_id"] == 35 y no > y hacemos uso de un identificador único lugar de la edad ? Alguna sugerencia ? Yo wan para averiguar el padre con ese id.

  2. 189

    esto devolverá primer partido

    @fathers.detect {|f| f["age"] > 35 }
    • Yo prefiero esto a través de #select – Pero todo va para el caso de uso. #detect volverá nil si no encuentra ninguna coincidencia, mientras que #select, en @la respuesta de Jordan, volverá [].
    • Usted podría también utilizar find en lugar de detect para un código más legible
    • find puede llegar a confundir en rails, sin embargo.
    • select y detect no son lo mismo, select será transversal a toda la matriz, mientras que detect se detendrá tan pronto como se encuentra la primera coincidencia. SI usted está buscando para UN partido @fathers.select {|f| f["age"] > 35 }.first vs @fathers.detect {|f| f["age"] > 35 } para el rendimiento y la legibilidad, mi voto va para detect
  3. 32

    si su matriz parece

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

    Y Quieres saber si algún valor ya está presente en la matriz. Utilizar El Método Find

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

    Esto será objeto de devolución si Hitesh está presente en el nombre, de lo contrario devuelve nil

    • Si el nombre era minúscula como "hitesh", no lo puedo devolver el hash. ¿Cómo podemos explicar la palabra de la carcasa, así como en tales casos?
    • usted puede usar algo como. de la matriz.encontrar {|x| x[:nombre].downcase == «Hitesh».downcase }

Dejar respuesta

Please enter your comment!
Please enter your name here