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, así que puedes iterar sobre ellos igual que sobre los arrays. Hay tres patrones comunes, según lo que quieras.

each te proporciona 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 claves:

prices.each_key { |k| puts k }   # apple, bread, milk

each_value recorre solo los valores:

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

Y todos los métodos de Enumerable que viste en el capítulo anterior, map, select, reduce: también funcionan con hashes. Simplemente recibes un par clave/valor (o un array de 2 elementos) en cada 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 => entero del precio).

Lee una línea de entrada: una lista separada por comas de artículos a los que aplicar un descuento del 50 % (que coincidan por nombre con los símbolos del hash).

Imprime, en este orden:

  1. Una línea por artículo con el formato <item>: $<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 conservan su orden original. Usa división entera para el descuento (price / 2).
  2. Was: $<n>: el total original (usa values.sum)
  3. Now: $<n>: el total después del descuento
  4. Los nombres de los artículos cuyo precio final todavía sea superior a 2, unidos con , (usa select + keys en el nuevo hash)

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

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

Pruébalo tú mismo

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

# TODO: construye el hash de precio-final mediante each; imprime líneas, totales, artículos caros
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

Practica por tu cuenta: Compilador de Ruby online