Menu
Coddy logo textTech

Itérer sur les Hashes

Fait partie de la section Logique et Flux du Journey Ruby de Coddy — leçon 34 sur 56.

Les hashes sont énumérables, vous pouvez donc les parcourir tout comme les tableaux. Il existe trois modèles courants, selon ce que vous souhaitez.

each vous donne à la fois la clé et la valeur :

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

each_key parcourt uniquement les clés :

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

each_value parcourt uniquement les valeurs :

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

Et chaque méthode Enumerable que vous avez vue au chapitre précédent, map, select, reduce : fonctionne aussi sur les hashes. Vous recevez simplement une paire clé/valeur (ou un tableau de 2 éléments) par itération :

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

Défi

Moyen

Vous appliquez une promotion à une liste de prix. Le hash prices est fourni (symbole de l'article => prix entier).

Lisez une ligne d'entrée : une liste d'articles à réduire de 50 % séparés par des virgules (correspondant aux noms des symboles dans le hash).

Affichez, dans cet ordre :

  1. Une ligne par article au format <item>: <item>: $<final_price>lt;final_price>, où le prix final est la valeur après remise si l'article est dans la liste de réduction, ou la valeur d'origine sinon. Itérez avec each. Les articles conservent leur ordre d'origine. Utilisez la division entière pour la remise (price / 2).
  2. Was: Was: $<n>lt;n> : le total d'origine (utilisez values.sum)
  3. Now: Now: $<n>lt;n> : le total après remise
  4. Les noms des articles dont le prix final est toujours supérieur à 2, joints par , (utilisez select + keys sur le nouveau hash)

Pour l'entrée bread,milk avec le hash par défaut, la sortie est :

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

Aide-mémoire

Itérer sur des hashs avec 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 }

Les méthodes Enumerable comme map, select et reduce fonctionnent également sur les hashs, recevant une paire clé/valeur par itération :

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

Méthodes de hash utiles : .values.sum pour additionner toutes les valeurs, .keys pour obtenir un tableau de clés.

Essayez vous-même

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

# À FAIRE : construire le hash du prix final via each ; afficher les lignes, les totaux, les articles chers
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Logique et Flux