Ruby Hash a la matriz de valores

Tengo este:

hash  = { "a"=>["a", "b", "c"], "b"=>["b", "c"] } 

y quiero llegar a esto: [["a","b","c"],["b","c"]]

Este parece que debería funcionar pero no lo hace:

hash.each{|key,value| value}
=> {"a"=>["a", "b", "c"], "b"=>["b", "c"]} 

Alguna sugerencia?

  • Las siguientes respuestas es la correcta (hash.values ser el mejor de la OMI). Pero lo que quería señalar cuando se proporciona un bloque de Hash#each simplemente devolverá la totalidad del valor del hash. Si desea hacer una operación en cada partida y regreso, que como una matriz, uso Hash#collect o su alias Hash#map. Más cosas sobre Enumerables aquí.
  • Esta pregunta parece extrañamente familiar… me pregunto cuántas personas están trabajando en la misma tarea para la casa ahora mismo.
InformationsquelleAutor tbrooke | 2012-03-05

6 Kommentare

  1. 246

    También, un poco más simple….

    >> hash = { "a"=>["a", "b", "c"], "b"=>["b", "c"] }
    => {"a"=>["a", "b", "c"], "b"=>["b", "c"]}
    >> hash.values
    => [["a", "b", "c"], ["b", "c"]]

    Ruby doc aquí

    • +! Que ingenioso! Voy a upvote a pesar de tener una competencia de respuesta (utilizando map), cos que me gusta mucho!
    • Hash#values no sólo es más simple, pero más eficiente. Comparar time ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.values' con time ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.map{|k,v| v}'
    • +1 (Deslumbrado sorprendentemente después probé tu código) me pasó un día sin suerte quitar el índice de uso de muchos métodos… Todo lo que puedo decir muchas gracias!!! 😀
    • Son las claves impreso en el orden exacto en que se producen ?
  2. 41

    Me gustaría utilizar:

    hash.map { |key, value| value }
    • sorprendido por la downvote! Esto funciona. He probado!
    • Yo no downvote, pero es más complicado equivalente a Hash#values.
    • Sí, yo también upvoted Ray respuesta. Estoy feliz de upvote, a la competencia de respuesta cuando me gusta demasiado.
    • Creo que no estamos compitiendo aquí, pero ayudándose unos a otros, ¿verdad? 🙂
    • Exactamente lo que estaba buscando, tratando de crear una matriz a partir de un hash usando las teclas de valores. Gracias 🙂
    • Útil cuando se necesita también hacer un poco de lógica con el teclas al mismo tiempo.
    • Puesto que usted no está utilizando el key variable, incluso se puede hacer hash.map { |_, value| value }

  3. 21
    hash.collect { |k, v| v }
    #returns [["a", "b", "c"], ["b", "c"]] 

    Enumerable#recopilar toma un bloque, y devuelve un array con los resultados de la ejecución del bloque una vez en cada elemento de la enumerable. Por lo que este código sólo ignora las llaves y devuelve un array con todos los valores.

    La Enumerable módulo es bastante impresionante. Sabiendo bien puede ahorrar un montón de tiempo y un montón de código.

    • No olvide que, como @Ray Toal de la respuesta, hash.values es en última instancia la respuesta correcta aquí.
    • O hash.map(&:second) 🙂
  4. 4

    Es tan simple como

    hash.values
    #=> [["a", "b", "c"], ["b", "c"]]

    este le devuelve una nueva matriz rellena con los valores de hash

    si desea almacenar que la nueva matriz de hacer

    array_of_values = hash.values
    #=> [["a", "b", "c"], ["b", "c"]]
    
    array_of_values
     #=> [["a", "b", "c"], ["b", "c"]]

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea