Menu
Coddy logo textTech

Iteración de Hashes

Parte de la sección Lógica y flujo del Journey de Ruby de Coddy — lección 34 de 56.

Los hashes son enumerables, por lo que puedes iterarlos al igual que los arrays. Hay tres patrones comunes, dependiendo de lo que desees.

each te entrega tanto la clave como el valor:

prices = { apple: 1, bread: 3, milk: 4 }
prices.each do |item, price|
  puts "#{item}: $#{price}"
end

each_key recorre solo las llaves:

prices.each_key { |k| puts k }   # manzana, pan, leche

each_value recorre solo los valores:

prices.each_value { |v| puts v }   # 1, 3, 4

Y cada método de Enumerable que viste en el capítulo anterior, map, select, reduce: también funciona en hashes. Simplemente recibes un par clave/valor (o un array de 2 elementos) por iteración:

prices.select { |item, price| price > 2 }
# {bread: 3, milk: 4}
challenge icon

Desafío

Intermedio

Estás aplicando una oferta a una lista de precios. Se proporciona el hash prices (símbolo del artículo => precio entero).

Lee una línea de entrada: una lista separada por comas de artículos a los que se les aplicará un descuento del 50% (coincidiendo con los símbolos en el hash, por nombre).

Imprime, en este orden:

  1. Una línea por artículo en el formato <item>: <item>: $<final_price>lt;final_price>, donde el precio final es el valor con descuento cuando el artículo está en la lista de descuentos, o el valor original en caso contrario. Itera con each. Los artículos mantienen su orden original. Usa división entera para el descuento (price / 2).
  2. Was: Was: $<n>lt;n>: el total original (usa values.sum)
  3. Now: Now: $<n>lt;n>: el total después del descuento
  4. Los nombres de los artículos cuyo precio final sigue siendo superior a 2, unidos con , (usa select + keys en el nuevo hash)

Para la entrada bread,milk con el hash por defecto, la salida es:

apple: $1
bread: $1
milk: $2
cheese: $6
Was: $14
Now: $10
cheese

Hoja de referencia

Iterando sobre hashes con each, each_key, each_value:

prices = { apple: 1, bread: 3, milk: 4 }

prices.each { |item, price| puts "#{item}: $#{price}" }
prices.each_key { |k| puts k }
prices.each_value { |v| puts v }

Los métodos de Enumerable como map, select y reduce también funcionan en hashes, recibiendo un par clave/valor por iteración:

prices.select { |item, price| price > 2 }
# { bread: 3, milk: 4 }

Métodos útiles de hash: .values.sum para sumar todos los valores, .keys para obtener un array de claves.

Pruébalo tú mismo

prices = { apple: 1, bread: 3, milk: 4, cheese: 6 }
discount = gets.chomp.split(",").map(&:to_sym)

# TODO: construir el hash de precio final a través de each; imprimir líneas, totales, artículos costosos
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y flujo