Itérables JavaScript
Les objets itérables sont des objets qui peuvent être itérés avec for..of
.
Techniquement, les itérables doivent implémenter la Symbol.iterator
méthode.
Itérer sur une chaîne
Vous pouvez utiliser une for..of
boucle pour parcourir les éléments d'une chaîne :
Exemple
for (const x of "W3Schools") {
// code block to be executed
}
Itérer sur un tableau
Vous pouvez utiliser une for..of
boucle pour parcourir les éléments d'un tableau :
Exemple
for (const x of [1,2,3,4,5] {
// code block to be executed
}
Itérateurs JavaScript
Le protocole itérateur définit comment produire une séquence de valeurs à partir d'un objet.
Un objet devient un itérateur lorsqu'il implémente une next()
méthode.
La next()
méthode doit renvoyer un objet avec deux propriétés :
- valeur (la valeur suivante)
- fait (vrai ou faux)
valeur | La valeur renvoyée par l'itérateur (peut être omise si done vaut true) |
---|---|
Fini |
vrai si l'itérateur a terminé faux si l'itérateur a produit une nouvelle valeur |
Itérable fait maison
Cet itérable retourne sans fin : 10,20,30,40,.... Everytime
next()
s'appelle :
Exemple
// Home Made Iterable
function myNumbers() {
let n = 0;
return {
next: function() {
n += 10;
return {value:n, done:false};
}
};
}
// Create Iterable
const n = myNumbers();
n.next(); // Returns 10
n.next(); // Returns 20
n.next(); // Returns 30
Le problème avec une maison rendue itérable :
Il ne prend pas en charge l'instruction JavaScript for..of
.
Un itérable JavaScript est un objet qui a un Symbol.iterator .
est une fonction Symbol.iterator
qui renvoie une next()
fonction.
Un itérable peut être itéré avec le code : for (const x of iterable) { }
Exemple
// Create an Object
myNumbers = {};
// Make it Iterable
myNumbers[Symbol.iterator] = function() {
let n = 0;
done = false;
return {
next() {
n += 10;
if (n == 100) {done = true}
return {value:n, done:done};
}
};
}
Maintenant, vous pouvez utiliser for..of
for (const num of myNumbers) {
// Any Code Here
}
La méthode Symbol.iterator est appelée automatiquement par for..of
.
Mais on peut aussi le faire "manuellement":
Exemple
let iterator = myNumbers[Symbol.iterator]();
while (true) {
const result = iterator.next();
if (result.done) break;
// Any Code Here
}