Aller au contenu principal

Assistants d'itérateurs

· 6 minutes de lecture
Rezvan Mahdavi Hezaveh

Les assistants d'itérateurs sont une collection de nouvelles méthodes sur le prototype d'Iterator qui aident à l'utilisation générale des itérateurs. Puisque ces méthodes d'assistance se trouvent sur le prototype d'Iterator, tout objet qui possède Iterator.prototype dans sa chaîne de prototypes (par exemple, les itérateurs de tableau) héritera des méthodes. Dans les sous-sections suivantes, nous expliquons les assistants d'itérateurs. Tous les exemples fournis fonctionnent sur une page d'archive de blog contenant une liste d'articles de blog, illustrant comment les assistants d'itérateurs sont utiles pour rechercher et manipuler des articles. Vous pouvez les essayer sur la page du blog V8 !

.map(mapperFn)

map prend une fonction de mappage comme argument. Cet assistant retourne un itérateur de valeurs avec la fonction de mappage appliquée aux valeurs d'origine de l'itérateur.

// Sélectionner la liste des articles de blog de la page d'archive.
const posts = document.querySelectorAll('li:not(header li)');

// Obtenir la liste des articles, retourner une liste de leur contenu textuel (titres) et les afficher.
for (const post of posts.values().map((x) => x.textContent)) {
console.log(post);
}

.filter(filtererFn)

filter prend une fonction de filtre en argument. Cet assistant retourne un itérateur des valeurs de l'itérateur d'origine pour lesquelles la fonction de filtre a retourné une valeur vraie.

// Sélectionner la liste des articles de blog de la page d'archive.
const posts = document.querySelectorAll('li:not(header li)');

// Filtrer les articles de blog qui contiennent `V8` dans leur contenu textuel (titres) et les afficher.
for (const post of posts.values().filter((x) => x.textContent.includes('V8'))) {
console.log(post);
}

.take(limit)

take prend un entier en argument. Cet assistant retourne un itérateur des valeurs de l'itérateur d'origine, jusqu'à limit valeurs.

// Sélectionner la liste des articles de blog de la page d'archive.
const posts = document.querySelectorAll('li:not(header li)');

// Sélectionner 10 articles de blog récents et les afficher.
for (const post of posts.values().take(10)) {
console.log(post);
}

.drop(limit)

drop prend un entier en argument. Cet assistant retourne un itérateur des valeurs de l'itérateur d'origine, en commençant par la valeur suivante après avoir sauté limit valeurs.

// Sélectionner la liste des articles de blog de la page d'archive.
const posts = document.querySelectorAll('li:not(header li)');

// Ignorer 10 articles de blog récents et afficher le reste.
for (const post of posts.values().drop(10)) {
console.log(post);
}

.flatMap(mapperFn)

flatMap prend une fonction de mappage en argument. Cet assistant retourne un itérateur des valeurs des itérateurs produits en appliquant la fonction de mappage aux valeurs d'origine de l'itérateur. Autrement dit, les itérateurs retournés par la fonction de mappage sont aplatis dans l'itérateur retourné par cet assistant.

// Sélectionner la liste des articles de blog de la page d'archive.
const posts = document.querySelectorAll('li:not(header li)');

// Obtenir la liste des tags des articles de blog et les afficher. Chaque article peut avoir
// plus d'un tag.
for (const tag of posts.values().flatMap((x) => x.querySelectorAll('.tag').values())) {
console.log(tag.textContent);
}

.reduce(reducer [, initialValue ])

reduce prend une fonction de réduction et une valeur initiale facultative. Cet assistant retourne une valeur résultant de l'application de la fonction de réduction à chaque valeur de l'itérateur tout en suivant le dernier résultat obtenu. La valeur initiale est utilisée comme point de départ pour la fonction de réduction lorsqu'elle traite la première valeur de l'itérateur.

// Sélectionner la liste des articles de blog de la page d'archive.
const posts = document.querySelectorAll('li:not(header li)');

// Obtenir la liste des tags pour tous les articles.
const tagLists = posts.values().flatMap((x) => x.querySelectorAll('.tag').values());

// Obtenir le contenu textuel pour chaque tag dans la liste.
const tags = tagLists.map((x) => x.textContent);

// Compter les articles avec le tag "security".
const count = tags.reduce((sum , value) => sum + (value === 'security' ? 1 : 0), 0);
console.log(count);

.toArray()

toArray retourne un tableau à partir des valeurs de l'itérateur.

// Sélectionner la liste des articles de blog de la page d'archive.
const posts = document.querySelectorAll('li:not(header li)');

// Créer un tableau à partir de la liste des 10 articles de blog récents.
const arr = posts.values().take(10).toArray();

.forEach(fn)

forEach prend une fonction en argument et l'applique à chaque élément de l'itérateur. Cet assistant est appelé pour son effet de bord et retourne undefined.

// Sélectionner la liste des articles de blog de la page d'archive.
const posts = document.querySelectorAll('li:not(header li)');

// Obtenez les dates où au moins un article de blog est publié et enregistrez-les.
const dates = new Set();
const forEach = posts.values().forEach((x) => dates.add(x.querySelector('time')));
console.log(dates);

.some(fn)

some prend une fonction prédicat comme argument. Ce helper renvoie true si un élément de l'itérateur retourne vrai lorsque cette fonction lui est appliquée. L'itérateur est consommé après l'appel de some.

// Sélectionnez la liste des articles de blog depuis une page d'archive de blog.
const posts = document.querySelectorAll('li:not(header li)');

// Découvrez si le contenu texte (titre) d'un article de blog inclut le mot-clé `Iterators`.
posts.values().some((x) => x.textContent.includes('Iterators'));

.every(fn)

every prend une fonction prédicat comme argument. Ce helper renvoie true si chaque élément de l'itérateur retourne vrai lorsque cette fonction lui est appliquée. L'itérateur est consommé après l'appel de every.

// Sélectionnez la liste des articles de blog depuis une page d'archive de blog.
const posts = document.querySelectorAll('li:not(header li)');

// Découvrez si le contenu texte (titre) de tous les articles de blog inclut le mot-clé `V8`.
posts.values().every((x) => x.textContent.includes('V8'));

.find(fn)

find prend une fonction prédicat comme argument. Ce helper renvoie la première valeur de l'itérateur pour laquelle la fonction retourne une valeur véridique, ou undefined si aucune valeur ne le fait.

// Sélectionnez la liste des articles de blog depuis une page d'archive de blog.
const posts = document.querySelectorAll('li:not(header li)');

// Enregistrez le contenu texte (titre) de l'article de blog récent incluant le mot-clé `V8`.
console.log(posts.values().find((x) => x.textContent.includes('V8')).textContent);

Iterator.from(object)

from est une méthode statique qui prend un objet en argument. Si l'object est déjà une instance d'Iterator, le helper le retourne directement. Si l'object possède Symbol.iterator, ce qui signifie qu'il est itérable, sa méthode Symbol.iterator est appelée pour obtenir l'itérateur et le helper le retourne. Sinon, un nouvel objet Iterator (qui hérite de Iterator.prototype et dispose des méthodes next() et return()) est créé pour encapsuler l'object et est retourné par ce helper.

// Sélectionnez la liste des articles de blog depuis une page d'archive de blog.
const posts = document.querySelectorAll('li:not(header li)');

// Créez d'abord un itérateur à partir des articles. Ensuite, enregistrez le contenu texte (titre)
// de l'article de blog récent qui inclut le mot-clé `V8`.
console.log(Iterator.from(posts).find((x) => x.textContent.includes('V8')).textContent);

Disponibilité

Les helpers d'Iterator sont disponibles depuis V8 v12.2.

Support des helpers d'Iterator