2011-01-04 13 views
8

tengo un hash que es de la forma {:a => {"aa" => 11,"ab" => 12}, :b => {"ba" => 21,"bb" => 22}}conversión de Rubí hashes a las matrices de

¿Cómo se convierte a la forma {:a => [["aa",11],["ab",12]],:b=>[["ba",21],["bb",22]]}

+0

Si está trabajando con los hashes de niveles múltiples y desea comprobar aplánelos mi gema HashModel: https://rubygems.org/gems/hashmodel y puedes obtener la fuente en github: https://github.com/mi kbe/hashmodel –

Respuesta

17

Si desea modificar el hash original, que puede hacer:

hash.each_pair { |key, value| hash[key] = value.to_a } 

de la documentación para Hash#to_a

Convierte hsh en una matriz anidada de matrices [ clave, valor].

h = { "c" => 300, "a" => 100, "d" => 400, "c" => 300 }

h.to_a #=> [["c", 300], ["a", 100], ["d", 400]]

+0

Gracias @mikej. Funcionó como un amuleto, aunque me gustaría saber cuál es la diferencia entre hash.each y hash.each_pair. –

+3

Si no desea modificar el hash original, puede usar esto: 'new_hash = hash.inject ({}) {| h, (key, value) | h [clave] = valor.a_a; h} ' –

+1

@Aditya: si quiere que su bloque obtenga dos parámetros, use' each_pair'. Si solo por legibilidad –

0
hash.collect {|a, b| [a, hash[a].collect {|c,d| [c,d]}] }.collect {|e,f| [e => f]} 
2

Aquí hay otra manera de hacer esto:

hsh = {:a => {"aa" => 11,"ab" => 12}, :b => {"ba" => 21,"bb" => 22}} 
hsh.each{|k,v| hsh[k]=*v} 
# => {:a=>[["aa", 11], ["ab", 12]], :b=>[["ba", 21], ["bb", 22]]} 
Cuestiones relacionadas