Tengo esto:
hash = { "a"=>["a", "b", "c"], "b"=>["b", "c"] }
y quiero llegar a esto: [["a","b","c"],["b","c"]]
Esto parece que debería funcionar, pero no es así:
hash.each{|key,value| value}
=> {"a"=>["a", "b", "c"], "b"=>["b", "c"]}
¿Alguna sugerencia?
hash.values
siendo la mejor en mi opinión). Pero quería señalar que cuando le proporcionas un bloqueHash#each
, solo devolverá el valor completo del hash. Si desea realizar una operación en cada elemento y devolverlo como una matriz, useHash#collect
o su aliasHash#map
. Más cosas sobre Enumerables aquí .Respuestas:
Además, un poco más simple ...
Ruby doc aquí
fuente
map
), ¡porque me gusta mucho esto!Hash#values
no solo es más simple, sino más eficiente. Comparartime ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.values'
contime ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.map{|k,v| v}'
Yo usaría:
fuente
Hash#values
.Enumerable#collect
toma un bloque y devuelve una matriz de los resultados de ejecutar el bloque una vez en cada elemento del enumerable. Entonces, este código simplemente ignora las claves y devuelve una matriz de todos los valores.El
Enumerable
módulo es bastante impresionante. Conocerlo bien puede ahorrarle mucho tiempo y mucho código.fuente
hash.values
es en última instancia la respuesta correcta aquí.hash.map(&:second)
:)fuente
Es tan simple como
esto devolverá una nueva matriz poblada con los valores de hash
si quieres almacenar esa nueva matriz, haz
fuente
También está este:
Por qué funciona:
La
&
llamato_proc
en el objeto, y pasa como un bloque para el método.fuente