Itérer sur les Hashes
Fait partie de la section Logique et Flux du Journey Ruby de Coddy. Leçon 34 sur 56.
Les hachages (hashes) sont énumérables, vous pouvez donc les parcourir tout comme des tableaux. Il existe trois motifs courants, selon ce que vous souhaitez obtenir.
each vous transmet à 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 } # pomme, pain, laiteach_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 également sur les hachages. 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 des soldes à une liste de prix. Le hash prices est fourni (symbole de l'article => prix entier).
Lisez une ligne en entrée : une liste séparée par des virgules d'articles à réduire de 50% (correspondant aux symboles dans le hash, par leur nom).
Affichez, dans cet ordre :
- Une ligne par article au format
<item>: $<final_price>, où le prix final est la valeur réduite quand l'article est dans la liste de réduction (discount), ou la valeur d'origine sinon. Parcourez aveceach. Les articles conservent leur ordre d'origine. Utilisez la division entière pour la réduction (price / 2). Was: $<n>: le total d'origine (utilisezvalues.sum)Now: $<n>: le total après réduction- Les noms des articles dont le prix final est toujours supérieur à
2, joints par,(utilisezselect+keyssur le nouveauhash)
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
cheeseEssayez vous-même
prices = { apple: 1, bread: 3, milk: 4, cheese: 6 }
discount = gets.chomp.split(",").map(&:to_sym)
# TODO: construire le hash des prix finaux 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 PipelineEntraînez-vous par vous-même : Compilateur Ruby en ligne