Signatur
Beschreibung
find() gehört zu den Iterator Helpers und funktioniert wie Array.prototype.find(), allerdings direkt auf einem Iterator. Das ist praktisch bei Generatoren, Map-/Set-Iteratoren oder anderen lazy Datenquellen: Ein Zwischen-Array mit [...iter] oder Array.from() ist nicht nötig.
Die Methode ruft next() so lange auf, bis die Testfunktion zum ersten Mal einen truthy-Wert liefert. Dann gibt sie dieses Element zurück und schließt den Iterator, indem sie seine return()-Methode aufruft. Findet sie nichts, läuft der Iterator komplett durch und das Ergebnis ist undefined.
Anders als map() oder filter() ist find() eine verbrauchende Methode: Sie gibt keinen neuen Iterator zurück, sondern gleich ein Ergebnis. Die bis zum Treffer gelesenen Elemente sind danach verbraucht. Daher eignet sich find() auch für unendliche Generatoren – vorausgesetzt, es gibt irgendwann einen Treffer.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $callbackFn Pflicht | (element: any, index: number) => unknown | Testfunktion, die für jedes erzeugte Element aufgerufen wird. Sie erhält das aktuelle element und dessen index (Zählung ab 0). Ein truthy-Rückgabewert gilt als Treffer. Anders als bei Arrays gibt es kein drittes Argument und kein thisArg. |
Rückgabewert
callbackFn truthy ist. Gibt es keinen Treffer, ist der Rückgabewert undefined.Beispiele
Erste Primzahl über 100 aus einem unendlichen Generator
function* naturalNumbers() {
let n = 1;
while (true) yield n++;
}
const isPrime = (n) => {
if (n < 2) return false;
for (let i = 2; i * i <= n; i++) if (n % i === 0) return false;
return true;
};
const prime = naturalNumbers().find((n) => n > 100 && isPrime(n));
console.log(prime);
Eintrag in einer Map nach Wert suchen
const users = new Map([
[1, { name: 'Anna', role: 'user' }],
[2, { name: 'Ben', role: 'admin' }],
[3, { name: 'Clara', role: 'admin' }]
]);
const firstAdmin = users.values().find((u) => u.role === 'admin');
console.log(firstAdmin?.name);
const guest = users.values().find((u) => u.role === 'guest');
console.log(guest);
Index nutzen und Schließen des Iterators beobachten
function* letters() {
try {
yield 'a';
yield 'b';
yield 'c';
} finally {
console.log('Generator geschlossen');
}
}
const result = letters().find((ch, index) => {
console.log(`prüfe ${ch} an Index ${index}`);
return ch === 'b';
});
console.log(result);
Beliebiges Iterable per Iterator.from() durchsuchen
const words = 'Iteratoren sind lazy und effizient'.split(' ');
const longWord = Iterator.from(words).find((w) => w.length > 8);
console.log(longWord);
// Wichtig · Fallstricke
- Nur auf Iteratoren, nicht auf Iterables: Arrays haben ihr eigenes
find(). Eigene Iterator-Objekte, die nicht vonIterator.prototypeerben, bekommen die Methode erst überIterator.from(obj). - Der Iterator wird verbraucht: Nach einem Treffer wird er per
return()geschlossen. Ein zweitesfind()auf demselben Generator-Objekt liefert deshalbundefined. - Unendliche Iteratoren: Gibt es nie einen Treffer, endet
find()nie (Endlosschleife). - Treffer und „kein Treffer“ können gleich aussehen: Wenn der gefundene Wert selbst
undefinedist, kann man ihn nicht von „nichts gefunden“ unterscheiden. Dann hilftsome()oder ein eigener Wrapper. - Ist
callbackFnkeine Funktion, wird einTypeErrorgeworfen, und zwar vor dem erstennext()-Aufruf (der Iterator wird dabei geschlossen). Wirft die Testfunktion selbst einen Fehler, wird der Iterator ebenfalls geschlossen und der Fehler weitergegeben. - Kompatibilität: Iterator Helpers gibt es erst seit 2024/2025 (Chrome/Edge 122, Firefox 131, Safari 18.4, Node.js 22). Für ältere Umgebungen gibt es einen Polyfill, z. B. über
core-js. Für asynchrone Iteratoren gibt es noch kein Gegenstück; das ist ein separater Vorschlag (Async Iterator Helpers).