Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

388
Vistas
¿Cómo combinar e imprimir valores de estructura de objetos anidados?

Tengo una matriz de hash y cada hash debe imprimirse en la misma línea.

 init_cards_j = [ { init1: [{ num: 6, head: 1 }, { num: 10, head: 1 }] }, { init2: [{ num: 53, head: 1 }, { num: 60, head: 1 }] }, { init3: [{ num: 77, head: 5 }] }, { init4: [{ num: 89, head: 1 }] } ]

Quiero que se vea así:

 Card 6: 1 head / Card 10: 1 head Card 53: 1 head / Card 60: 1 head Card 77: 5 head Card 89: 1 haed

Probé a continuación:

 init_cards_j.each_index do |index| init_cards_j[index].values[0].each do |pair| init_cards_j[index].each do |key, value| value.each do |pair| puts "Card #{pair[:num]}: #{pair[:head]} kettle head. / " end end end end

Que genera los datos como:

 Card 6: 1 kettle head. / Card 10: 1 kettle head. / Card 6: 1 kettle head. / Card 10: 1 kettle head. / Card 53: 1 kettle head. / Card 60: 1 kettle head. / Card 53: 1 kettle head. / Card 60: 1 kettle head. / Card 77: 5 kettle head. / Card 89: 1 kettle head. /

Lamento que mi matriz esté tan anidada que necesito ordenar el orden por num para cada hash, los puse en una matriz.

¡Gracias por adelantado!

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Puede iterar los hashes en init_cards_j a través de each y para cada hash llame a each_value para recorrer sus valores. Luego, en lugar de imprimir todas las tarjetas de inmediato, puede generar una matriz intermedia a través del map y join el resultado usando su cadena de separación:

 init_cards_j.each do |hash| hash.each_value do |values| puts values.map { |c| "Card #{c[:num]}: #{c[:head]} head" }.join(' / ') end end

Pero sería más fácil convertir la matriz de hash en un solo hash: (suponiendo que sus claves sean únicas)

 cards = { init1: [{ num: 6, head: 1 }, { num: 10, head: 1 }], init2: [{ num: 53, head: 1 }, { num: 60, head: 1 }], init3: [{ num: 77, head: 5 }], init4: [{ num: 89, head: 1 }] }

Si debe conservar la estructura dada, puede convertirla sobre la marcha:

 cards = init_cards_j.inject(&:merge)

Esto hace que el ciclo sea un poco más simple:

 cards.each_value do |values| puts values.map { |c| "Card #{c[:num]}: #{c[:head]} head" }.join(' / ') end

Para refinar aún más la salida, puede separar el bucle de la descripción de la tarjeta extrayendo esta última en un método:

 def description(card) "Card #{card[:num]}: #{card[:head]} head" end init_cards_j.each do |hash| hash.each_value do |values| puts values.map { |card| description(card) }.join(' / ') end end

Ahora puede agregar más lógica a la cadena de salida editando el método de description , por ejemplo:

 def description(card) if card[:head] == 1 "Card #{card[:num]}: #{card[:head]} head" else "Card #{card[:num]}: #{card[:head]} heads" end end

Lo anterior se puede escribir mucho más compacto, pero te dejaré la optimización a ti.

over 4 years ago · Santiago Trujillo Denunciar

0

Recomendaría la primera respuesta de @Stefan, pero aquí hay otra forma de lograr el mismo resultado.

Podríamos comenzar con un método de ayuda, que por supuesto puede probar por separado:

 def print_num_and_head(g) print "Card %d: %d head" % g.values_at(:num, :head) end

Si

 g = {:num=>6, :head=>1})

entonces

 print_num_and_head(g)

muestra

 Card 6: 1 head

sin un terminador de línea.

Entonces podemos escribir:

 init_cards_j.each do |h| _, (g, *arr) = h.flatten print_num_and_head(g) arr.each do |g| print ' / ' print_num_and_head(g) end puts end

huellas dactilares

 Card 6: 1 head / Card 10: 1 head Card 53: 1 head / Card 60: 1 head Card 77: 5 head Card 89: 1 head

Aquí he usado la potente sintaxis de matriz # descomposición (también conocida como desambiguación de matriz ) de Ruby para sacar ventaja:

Si

 h = { init1: [{ num: 6, head: 1 }, { num: 10, head: 1 }] }

entonces

 _, (g, *arr) = h.flatten #=> [:init1, [{:num=>6, :head=>1}, {:num=>10, :head=>1}]] _ #=> :init1 g #=> {:num=>6, :head=>1} arr #=> [{:num=>10, :head=>1}]

He empleado la convención común de representar una variable de bloque con un guión bajo cuando no se usa en el cálculo del bloque.

Consulte este artículo para obtener una explicación más completa de la descomposición de matrices.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda