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

Iterator.prototype.some()

Methode

Prüft, ob mindestens ein vom Iterator geliefertes Element die Testfunktion erfüllt, und gibt <code>true</code> oder <code>false</code> zurück.

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

Signatur

Iterator.prototype.some(callbackFn)

Beschreibung

Iterator.prototype.some() gehört zu den Iterator Helpers und funktioniert wie Array.prototype.some(), allerdings direkt auf einem Iterator. Dafür muss vorher kein Array erzeugt werden. Die Methode ruft callbackFn für jedes Element auf, bis die Funktion zum ersten Mal einen truthy Wert liefert. Dann gibt sie sofort true zurück. Ist der Iterator erschöpft, ohne dass ein Treffer gefunden wurde, lautet das Ergebnis false.

Die Methode ist besonders nützlich bei großen, teuren oder unendlichen Folgen, etwa bei Generatoren, Map.prototype.values() oder Set.prototype.keys(). Weil sie beim ersten Treffer abbricht (Kurzschlussauswertung), werden nur so viele Elemente erzeugt wie nötig.

Wird ein Treffer gefunden, schließt some() den zugrunde liegenden Iterator, indem es dessen return()-Methode aufruft. Bei Generatoren laufen dadurch z. B. finally-Blöcke zum Aufräumen. Der Iterator ist danach verbraucht. Ein zweiter Aufruf von some() auf demselben Iterator arbeitet nur noch mit den restlichen Elementen oder mit gar keinen.

Parameter

Name Typ Default Beschreibung
$callbackFn Pflicht (element: any, index: number) => any Testfunktion, die für jedes Element aufgerufen wird. Liefert sie einen truthy Wert, gilt das Element als Treffer. Sie erhält das aktuelle element und dessen fortlaufenden index (ab 0). Anders als bei Arrays gibt es kein drittes Argument und kein thisArg.

Rückgabewert

Typ
boolean
Beschreibung
true, sobald die Testfunktion für ein Element einen truthy Wert liefert; sonst false. Für einen leeren Iterator ist das Ergebnis immer false.

Beispiele

Unendlichen Generator durchsuchen

function* fibonacci() {
  let [a, b] = [0, 1];
  while (true) {
    yield a;
    [a, b] = [b, a + b];
  }
}

// Bricht beim ersten Treffer ab – trotz unendlicher Folge
const hatGrosseZahl = fibonacci().some((n) => n > 1000);
console.log(hatGrosseZahl);
true

Map-Werte prüfen, ohne ein Array zu erzeugen

const lagerbestand = new Map([
  ['Apfel', 12],
  ['Birne', 0],
  ['Kiwi', 7]
]);

const etwasAusverkauft = lagerbestand.values().some((menge) => menge === 0);
const etwasUeber100 = lagerbestand.values().some((menge) => menge > 100);

console.log(etwasAusverkauft, etwasUeber100);
true false

Index nutzen und Aufräumen per return() beobachten

function* zeilen() {
  try {
    yield 'INFO Start';
    yield 'ERROR Datei fehlt';
    yield 'INFO Ende';
  } finally {
    console.log('Iterator geschlossen');
  }
}

const fehlerGefunden = zeilen().some((zeile, index) => {
  console.log(`Prüfe Zeile ${index}`);
  return zeile.startsWith('ERROR');
});

console.log(fehlerGefunden);
Prüfe Zeile 0 Prüfe Zeile 1 Iterator geschlossen true

Beliebiges Iterable mit Iterator.from() verwenden

// Objekt mit eigenem next(), das nicht von Iterator.prototype erbt
let i = 0;
const zaehler = { next: () => (i < 5 ? { value: i++, done: false } : { value: undefined, done: true }) };

const hatGerade = Iterator.from(zaehler).some((n) => n > 0 && n % 2 === 0);
console.log(hatGerade);
true

// Wichtig · Fallstricke

  • Verbrauch: some() rückt den Iterator weiter. Wer mehrere Prüfungen braucht, muss jedes Mal einen neuen Iterator erzeugen (z. B. map.values() erneut aufrufen) oder die Daten vorher in ein Array umwandeln.
  • Kein Abbruch ohne Treffer: Bei einem unendlichen Iterator ohne passendes Element läuft some() endlos und blockiert den Thread.
  • Nur Iterator-Instanzen: Die Methode gibt es nur auf Objekten, die von Iterator.prototype erben (Generatoren, eingebaute Iteratoren). Arrays selbst nutzen Array.prototype.some(). Eigene Iterator-Objekte bindet man mit Iterator.from() ein.
  • Ist callbackFn keine Funktion, wird sofort ein TypeError geworfen. Wirft die Testfunktion selbst einen Fehler, wird der Iterator vorher per return() geschlossen.
  • Es gibt kein thisArg. Den gewünschten Kontext bindet man mit einer Pfeilfunktion oder bind().
  • Kompatibilität: Iterator Helpers sind recht neu (Chrome/Edge 122+, Firefox 131+, Safari 18.4+, Node.js 22+). Für ältere Umgebungen gibt es Polyfills, z. B. core-js. Für asynchrone Iteratoren gibt es noch kein Gegenstück, AsyncIterator-Helpers sind noch ein Vorschlag.