Matriz mixta de Ruby a hash anidado
Frecuentes
Visto 1,195 veces
1
Tengo una matriz de Ruby cuyos elementos se alternan entre cadenas y hashes. Por ejemplo-
["1234", Hash#1, "5678", Hash#2]
Me gustaría crear una estructura hash anidada a partir de esto. Entonces,
hash["1234"]["key in hash#1"] = value
hash["5678"]["key in hash#2"] = value
¿Alguien tiene / ahora una buena manera de hacer esto? Gracias.
4 Respuestas
7
Sólo tiene que utilizar
hsh = Hash[*arr] #suppose arr is the array you have
Cortará 2 a la vez y se convertirá en hash.
contestado el 22 de mayo de 12 a las 17:05
Necesita Hash[*arr]
¡pero +1 por un punto excelente! - Phrogz
3
No creo que haya un método en la matriz para hacer esto directamente. El siguiente código funciona y es bastante fácil de leer.
hsh = {}
ary.each_slice(2) do |a, b|
hsh[a] = b
end
# Now `hsh` is as you want it to be
contestado el 22 de mayo de 12 a las 16:05
Más simple: hsh = Hash[ ary.each_slice(2).to_a ]
(ver mi respuesta). - Phrogz
1
Adivinando lo que quieres, ya que "ingresar hash#1" no está nada claro, ni has definido qué hash
or value
debiera ser:
value = 42
h1 = {a:1}
h2 = {b:2}
a = ["1234",h1,"5678",h2]
a.each_slice(2).each{ |str,h| h[str] = value }
p h1, #=> {:a=>1, "1234"=>42}
h2 #=> {:b=>2, "5678"=>42}
Alternativamente, tal vez te refieres a esto:
h1 = {a:1}
h2 = {b:2}
a = ["1234",h1,"5678",h2]
hash = Hash[ a.each_slice(2).to_a ]
p hash #=> {"1234"=>{:a=>1}, "5678"=>{:b=>2}}
p hash["1234"][:a] #=> 1
contestado el 22 de mayo de 12 a las 16:05
1
supongamos, usando facetas solo por diversión:
require 'facets'
xs = ["1234", {:a => 1, :b => 2}, "5678", {:c => 3}]
xs.each_slice(2).mash.to_h
#=> {"1234"=>{:a=>1, :b=>2}, "5678"=>{:c=>3}}
contestado el 22 de mayo de 12 a las 17:05
Ya cubierto por la respuesta de ksol (en una forma menos eficiente) y mi respuesta (directamente). - Phrogz
Bueno, no hay nada de malo en sacar de otra respuesta para hacer la mejor respuesta posible. (Estoy diciendo explícitamente que debe agregar el Hash[]
versión a su respuesta, especialmente si obtiene la aceptación). Anteriormente, su respuesta era solo una duplicación, pero ahora es +1 :) - Phrogz
@Phrogz: Cuando lo estaba escribiendo, solo vi la respuesta de ksol. Y seguro que no me gusta que cada uno construya un hash :-) gracias por el +1 en cualquier caso. - tierra de tokland
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas ruby-on-rails ruby hash multidimensional-array hashmap or haz tu propia pregunta.
No está del todo claro lo que quieres aquí. ¿Desea tomar cada segundo elemento de la matriz (que debería ser un hash) y crear una clave usando el elemento anterior en la matriz con un valor hash que crea en función de las claves existentes en el hash original (segundo elemento en el formación)? - coreyward
los hashes pueden tener más de una clave/valor, ¿dónde irían? intente usar Ruby válido en los ejemplos. Es más fácil si dices: 1) Tengo esta matriz (matriz real) y 2) Quiero este resultado, y 3) Eso es lo que he intentado hasta ahora. - tokland
He rechazado tu pregunta porque no está clara. Si edita su pregunta para aclarar cómo se verían los datos reales y qué quiere que ocurra con esos datos, con gusto revocaré mi voto. - Phrogz