Start · Sprachen · JavaScript · Referenz · Iterator.prototype.find()

Iterator.prototype.find()

Methode

Gibt das erste vom Iterator erzeugte Element zurück, für das <code>callbackFn</code> einen truthy-Wert liefert, sonst <code>undefined</code>.

seit JavaScript ES2025 (Iterator Helpers) – Baseline 2025: Chrome Kategorie: method-property

Signatur

Iterator.prototype.find(callbackFn)

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

Typ
any | undefined
Beschreibung
Das erste Element, für das 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);
101

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);
Ben undefined

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);
prüfe a an Index 0 prüfe b an Index 1 Generator geschlossen b

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);
Iteratoren

// Wichtig · Fallstricke

  • Nur auf Iteratoren, nicht auf Iterables: Arrays haben ihr eigenes find(). Eigene Iterator-Objekte, die nicht von Iterator.prototype erben, bekommen die Methode erst über Iterator.from(obj).
  • Der Iterator wird verbraucht: Nach einem Treffer wird er per return() geschlossen. Ein zweites find() auf demselben Generator-Objekt liefert deshalb undefined.
  • Unendliche Iteratoren: Gibt es nie einen Treffer, endet find() nie (Endlosschleife).
  • Treffer und „kein Treffer“ können gleich aussehen: Wenn der gefundene Wert selbst undefined ist, kann man ihn nicht von „nichts gefunden“ unterscheiden. Dann hilft some() oder ein eigener Wrapper.
  • Ist callbackFn keine Funktion, wird ein TypeError geworfen, und zwar vor dem ersten next()-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).