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}"
endeach_key recorre solo las llaves:
prices.each_key { |k| puts k } # manzana, pan, lecheeach_value recorre solo los valores:
prices.each_value { |v| puts v } # 1, 3, 4Y 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}Desafío
IntermedioEstá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:
- 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 coneach. Los artículos mantienen su orden original. Usa división entera para el descuento (price / 2). Was: Was: $<n>lt;n>: el total original (usavalues.sum)Now: Now: $<n>lt;n>: el total después del descuento- Los nombres de los artículos cuyo precio final sigue siendo superior a
2, unidos con,(usaselect+keysen 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
cheeseHoja 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
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
1Strings en profundidad
Visión general de los métodos de StringInterpolación de StringsIterar sobre StringsSplit y JoinRepaso - String Weaver4Bloques, Procs y Lambdas
¿Qué es un bloque?do..end vs llavesLa palabra clave yieldParámetros de bloqueProcs y LambdasResumen - Iterador personalizado7Hashes Parte 2
Hash.new con valores por defectoIteración de HashesHashes anidadosFusión y transformaciónResumen - Contador de frecuencia10Proyecto - Registros de Estudiantes
Descripción general del proyectoAgregar estudiante5Potencia de Enumerable
Select y RejectEncadenando MapReduce / Injectcount, all?, any?, none?group_by y partitionsort_by, min_by, max_byResumen - Data Pipeline