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}"
endeach_key parcourt uniquement les clés :
prices.each_key { |k| puts k } # apple, bread, milkeach_value parcourt uniquement les valeurs :
prices.each_value { |v| puts v } # 1, 3, 4Et 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}Défi
MoyenVous 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 :
- 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 aveceach. Les articles conservent leur ordre d'origine. Utilisez la division entière pour la remise (price / 2). Was: Was: $<n>lt;n>: le total d'origine (utilisezvalues.sum)Now: Now: $<n>lt;n>: le total après remise- Les noms des articles dont le prix final est toujours supérieur à
2, joints par,(utilisezselect+keyssur 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
cheeseAide-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
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
1Les chaînes de caractères en profondeur
Aperçu des méthodes de chaînesInterpolation de chaînesParcourir les chaînesSplit et JoinRécapitulatif - String Weaver4Blocs, Procs & Lambdas
Qu'est-ce qu'un bloc ?do..end vs AccoladesLe mot-clé yieldParamètres de blocProcs et LambdasRécapitulatif - Itérateur personnalisé7Hashes - Partie 2
Hash.new avec des valeurs par défautItérer sur les HashesHashes imbriquésFusion et transformationRécapitulatif - Compteur de fréquence10Projet - Dossiers étudiants
Présentation du projetAjouter un étudiant2Intervalles
Qu'est-ce qu'un intervalle ?Méthodes d'intervalleLes intervalles dans Case / WhenRécapitulatif - Pratique des intervalles5La puissance d'Enumerable
Select et RejectChaîner MapReduce / Injectcount, all?, any?, none?group_by et partitionsort_by, min_by, max_byRécapitulatif - Data Pipeline