Itérateurs en JavaScript

Qu'est-ce qu'un itérateur ?

Les itérateurs sont des outils puissants qui permettent de parcourir une collection de données ou un groupe d'éléments. Ils jouent un rôle essentiel dans la manière dont nous gérons et manipulons les données dans JavaScript. Un itérateur est un objet qui respecte les protocoles d'itération, ce qui signifie qu'il peut être utilisé pour parcourir des types de données intégrés comme les chaînes de caractères, les tableaux, les cartes (maps), les ensembles (sets) et plus encore.

Protocoles itérables et d'itérateur

Le protocole itérable exige que tous les objets itérables possèdent la méthode @@iterator. Concrètement, cela signifie qu'un objet doit avoir ou hériter, via sa chaîne de prototypes, la clé de propriété @@iterator. Lorsqu'un objet doit être parcouru, la méthode @@iterator est invoquée sans arguments, et l'itérateur retourné s'occupe des valeurs ou éléments à itérer. D'autre part, le protocole d'itérateur est défini par l'implémentation de la méthode next(), qui renvoie un objet contenant au moins deux propriétés :

  • done : un booléen qui indique si la séquence est terminée (true) ou non (false).
  • value : la valeur retournée par l'itérateur.

Exemple d'itérateur

Prenons un exemple d'itérateur basé sur une plage de nombres, qui parcourt une collection d'entiers tout en satisfaisant les protocoles d'itération :

function createRangeIterator(min = 0, max = Infinity, step = 1) {  
  let nextNum = min;  
  let numCount = 0;

  const rangeIterator = {    
    next: function () {  
      let result;  
      if (nextNum < max) {  
        result = { value: nextNum, done: false };  
        nextNum += step;  
        numCount++;  
        return result;  
      }  
      return { value: numCount, done: true };  
    },  
  };

  return rangeIterator;
}

Dans cet exemple, l'objet rangeIterator respecte le protocole d'itérateur. Une fois que tous les éléments de la collection de plages ont été parcourus, la propriété done devient vraie et est renvoyée.

Utilisation de l'itérateur créé

Pour utiliser l'itérateur défini ci-dessus, vous pouvez faire comme suit :

const useCase = createRangeIterator(2, 8, 2);
let result = useCase.next();
while (!result.done) {  
  console.log(result.value);  
  result = useCase.next();
}

Cela affichera :

2
4
6

Exemple pratique avec les chaînes de caractères

Pour mettre en pratique l'utilisation d'un itérateur, voyons comment il fonctionne avec une chaîne de caractères. Vous pouvez exécuter le code suivant pour voir un exemple d'itération sur une chaîne.

const stringIterator = (str) => {
  let index = 0;
  return {
    next: function () {
      if (index < str.length) {
        return { value: str[index++], done: false };
      }
      return { value: undefined, done: true };
    }
  };
};

const text = stringIterator("Bonjour");
let char = text.next();
while (!char.done) {
  console.log(char.value);
  char = text.next();
}

Ce code affichera chaque caractère de la chaîne "Bonjour".