JavaScript : rendre le Web interactif (école d'ingénieur) · Chapitre 6 · Exercice de TD
Un panier itérable
Classes et modules · niveau 3 (difficile)
Énoncé
On veut pouvoir écrire for (const [isbn, quantite] of panier) et [...panier]. Un objet est itérable s'il a une méthode dont le nom est le symbole Symbol.iterator et qui rend un itérateur ; dans la classe, on l'écrit
[Symbol.iterator]() {
// rendre un itérateur
}
Sachant que map.entries() rend un itérateur sur les paires d'une Map, rendre itérable un panier dont les lignes sont dans une Map privée. Que donnent alors new Map(panier) et const [[premier]] = panier ?
Corrigé
class Panier {
#lignes = new Map();
ajouter(isbn, quantite = 1) {
this.#lignes.set(isbn, (this.#lignes.get(isbn) ?? 0) + quantite);
}
// Un objet est itérable s'il a une méthode [Symbol.iterator] qui rend un
// itérateur ; celui de la Map convient tel quel.
[Symbol.iterator]() {
return this.#lignes.entries();
}
}
const p = new Panier();
p.ajouter("9782956300014", 2);
p.ajouter("9782956300052");
for (const [isbn, quantite] of p) {
console.log(isbn, quantite);
}
console.log([...p].length, new Map(p).get("9782956300014"));
const [[premier]] = p;
console.log(premier);
9782956300014 2
9782956300052 1
2 2
9782956300014
for...of, la décomposition [...p], le constructeur de Map et la déstructuration de tableau acceptent tous un itérable : ils appellent p[Symbol.iterator]() et consomment l'itérateur rendu. const [[premier]] = p prend la première paire, puis le premier élément de cette paire : l'ISBN. Le panier reste maître de ses données : l'itérateur permet de les lire, pas de les modifier.
100 % gratuit
La suite du chapitre est sur Adloun
- 10 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.