Zum Hauptinhalt springen

Iterator-Helfer

· 6 Minuten Lesezeit
Rezvan Mahdavi Hezaveh

Iterator-Helfer sind eine Sammlung neuer Methoden auf dem Iterator-Prototyp, die bei der allgemeinen Verwendung von Iteratoren helfen. Da sich diese Hilfsmethoden auf dem Iterator-Prototyp befinden, erhalten alle Objekte, die Iterator.prototype in ihrer Prototypenkette haben (z. B. Array-Iteratoren), diese Methoden. In den folgenden Abschnitten erklären wir die Iterator-Helfer. Alle bereitgestellten Beispiele funktionieren auf einer Blog-Archivseite, die eine Liste von Blog-Beiträgen enthält, und veranschaulichen, wie Iterator-Helfer beim Finden und Bearbeiten der Beiträge hilfreich sind. Sie können sie auf der V8-Blogseite ausprobieren!

.map(mapperFn)

map nimmt eine Mapperfunktion als Argument an. Diese Hilfsmethode gibt einen Iterator von Werten zurück, bei denen die Mapperfunktion auf die ursprünglichen Iteratorwerte angewendet wurde.

// Wählen Sie die Liste der Blog-Beiträge von einer Blog-Archivseite aus.
const posts = document.querySelectorAll('li:not(header li)');

// Holen Sie die Liste der Beiträge, geben Sie eine Liste ihres Textinhalts (Titel) zurück und protokollieren Sie sie.
for (const post of posts.values().map((x) => x.textContent)) {
console.log(post);
}

.filter(filtererFn)

filter nimmt eine Filterfunktion als Argument an. Diese Hilfsmethode gibt einen Iterator von Werten aus dem ursprünglichen Iterator zurück, für die die Filterfunktion einen wahrheitswertigen Wert zurückgab.

// Wählen Sie die Liste der Blog-Beiträge von einer Blog-Archivseite aus.
const posts = document.querySelectorAll('li:not(header li)');

// Filtern Sie Blog-Beiträge, die `V8` in ihrem Textinhalt (Titel) enthalten, und protokollieren Sie sie.
for (const post of posts.values().filter((x) => x.textContent.includes('V8'))) {
console.log(post);
}

.take(limit)

take nimmt eine Ganzzahl als Argument. Diese Hilfsmethode gibt einen Iterator von Werten aus dem ursprünglichen Iterator zurück, bis zu limit Werten.

// Wählen Sie die Liste der Blog-Beiträge von einer Blog-Archivseite aus.
const posts = document.querySelectorAll('li:not(header li)');

// Wählen Sie 10 aktuelle Blog-Beiträge aus und protokollieren Sie sie.
for (const post of posts.values().take(10)) {
console.log(post);
}

.drop(limit)

drop nimmt eine Ganzzahl als Argument. Diese Hilfsmethode gibt einen Iterator von Werten aus dem ursprünglichen Iterator zurück, beginnend mit dem Wert nach den limit Werten.

// Wählen Sie die Liste der Blog-Beiträge von einer Blog-Archivseite aus.
const posts = document.querySelectorAll('li:not(header li)');

// Überspringen Sie 10 aktuelle Blog-Beiträge und protokollieren Sie den Rest.
for (const post of posts.values().drop(10)) {
console.log(post);
}

.flatMap(mapperFn)

flatMap nimmt eine Mapperfunktion als Argument an. Diese Hilfsmethode gibt einen Iterator der Werte der Iteratoren zurück, die durch Anwenden der Mapperfunktion auf die ursprünglichen Iteratorwerte erzeugt werden. Das heißt, die Iteratoren, die von der Mapperfunktion zurückgegeben werden, werden zu einem Iterator zusammengeführt, der von dieser Hilfsmethode zurückgegeben wird.

// Wählen Sie die Liste der Blog-Beiträge von einer Blog-Archivseite aus.
const posts = document.querySelectorAll('li:not(header li)');

// Holen Sie die Liste der Tags der Blog-Beiträge und protokollieren Sie sie. Jeder Beitrag kann mehr als
// ein Tag haben.
for (const tag of posts.values().flatMap((x) => x.querySelectorAll('.tag').values())) {
console.log(tag.textContent);
}

.reduce(reducer [, initialValue ])

reduce nimmt eine Reduzierfunktion und einen optionalen Anfangswert. Diese Hilfsmethode gibt einen Wert als Ergebnis der Anwendung der Reduzierfunktion auf jeden Wert des Iterators zurück, wobei der letzte Rückgabewert der Reduzierfunktion beibehalten wird. Der Anfangswert wird als Ausgangspunkt für die Reduzierfunktion verwendet, wenn sie den ersten Wert des Iterators verarbeitet.

// Wählen Sie die Liste der Blog-Beiträge von einer Blog-Archivseite aus.
const posts = document.querySelectorAll('li:not(header li)');

// Holen Sie die Liste der Tags für alle Beiträge.
const tagLists = posts.values().flatMap((x) => x.querySelectorAll('.tag').values());

// Holen Sie den Textinhalt für jedes Tag in der Liste.
const tags = tagLists.map((x) => x.textContent);

// Zählt Beiträge mit dem Tag 'security'.
const count = tags.reduce((sum , value) => sum + (value === 'security' ? 1 : 0), 0);
console.log(count);

.toArray()

toArray gibt ein Array aus den Iteratorwerten zurück.

// Wählen Sie die Liste der Blog-Beiträge von einer Blog-Archivseite aus.
const posts = document.querySelectorAll('li:not(header li)');

// Erstellen Sie ein Array aus der Liste von 10 aktuellen Blog-Beiträgen.
const arr = posts.values().take(10).toArray();

.forEach(fn)

forEach nimmt eine Funktion als Argument und wird auf jedes Element des Iterators angewendet. Diese Hilfsmethode wird wegen ihrer Nebenwirkungen aufgerufen und gibt undefined zurück.

// Wählen Sie die Liste der Blog-Beiträge von einer Blog-Archivseite aus.
const posts = document.querySelectorAll('li:not(header li)');

// Holen Sie sich die Daten, an denen mindestens ein Blogbeitrag veröffentlicht wurde, und loggen Sie sie.
const dates = new Set();
const forEach = posts.values().forEach((x) => dates.add(x.querySelector('time')));
console.log(dates);

.some(fn)

some nimmt eine Prädikatfunktion als Argument. Dieser Helfer gibt true zurück, wenn ein beliebiges Iterator-Element true ausgibt, wenn die Funktion darauf angewendet wird. Der Iterator wird nach dem Aufruf von some verbraucht.

// Wählen Sie die Liste der Blogbeiträge von einer Blog-Archiv-Seite aus.
const posts = document.querySelectorAll('li:not(header li)');

// Finden Sie heraus, ob der Textinhalt (Titel) eines Blogbeitrags das Schlüsselwort `Iterators` enthält.
// Schlüsselwort.
posts.values().some((x) => x.textContent.includes('Iterators'));

.every(fn)

every nimmt eine Prädikatfunktion als Argument. Dieser Helfer gibt true zurück, wenn jedes Iterator-Element true ausgibt, wenn die Funktion darauf angewendet wird. Der Iterator wird nach dem Aufruf von every verbraucht.

// Wählen Sie die Liste der Blogbeiträge von einer Blog-Archiv-Seite aus.
const posts = document.querySelectorAll('li:not(header li)');

// Finden Sie heraus, ob der Textinhalt (Titel) aller Blogbeiträge das Schlüsselwort `V8` enthält.
posts.values().every((x) => x.textContent.includes('V8'));

.find(fn)

find nimmt eine Prädikatfunktion als Argument. Dieser Helfer gibt den ersten Wert des Iterators zurück, für den die Funktion einen Wahrheitswert ausgibt, oder undefined, wenn kein Wert des Iterators dies tut.

// Wählen Sie die Liste der Blogbeiträge von einer Blog-Archiv-Seite aus.
const posts = document.querySelectorAll('li:not(header li)');

// Loggen Sie den Textinhalt (Titel) des aktuellen Blogbeitrags, der das Schlüsselwort `V8` enthält.
console.log(posts.values().find((x) => x.textContent.includes('V8')).textContent);

Iterator.from(object)

from ist eine statische Methode und nimmt ein Objekt als Argument. Wenn das object bereits eine Instanz von Iterator ist, gibt der Helfer es direkt zurück. Wenn das object Symbol.iterator hat, was bedeutet, dass es iterabel ist, wird seine Symbol.iterator-Methode aufgerufen, um den Iterator zu erhalten, und der Helfer gibt ihn zurück. Ansonsten wird ein neues Iterator-Objekt (das vom Iterator.prototype erbt und next() und return()-Methoden hat) erstellt, das das object umschließt und von diesem Helfer zurückgegeben wird.

// Wählen Sie die Liste der Blogbeiträge von einer Blog-Archiv-Seite aus.
const posts = document.querySelectorAll('li:not(header li)');

// Zuerst erstellen Sie einen Iterator aus den Beiträgen. Dann loggen Sie den Textinhalt (Titel) des aktuellen Blogbeitrags, der das Schlüsselwort `V8` enthält.
console.log(Iterator.from(posts).find((x) => x.textContent.includes('V8')).textContent);

Verfügbarkeit

Iterator-Helfer sind in V8 v12.2 verfügbar.

Unterstützung für Iterator-Helfer