Matriz mixta de Ruby a hash anidado

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.

preguntado el 22 de mayo de 12 a las 16:05

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)? -

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. -

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. -

4 Respuestas

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

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

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

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 or haz tu propia pregunta.