Adloun

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

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →