Signatur
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
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);
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);
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);
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);
// 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.prototypeerben (Generatoren, eingebaute Iteratoren). Arrays selbst nutzenArray.prototype.some(). Eigene Iterator-Objekte bindet man mitIterator.from()ein. - Ist
callbackFnkeine Funktion, wird sofort einTypeErrorgeworfen. Wirft die Testfunktion selbst einen Fehler, wird der Iterator vorher perreturn()geschlossen. - Es gibt kein
thisArg. Den gewünschten Kontext bindet man mit einer Pfeilfunktion oderbind(). - 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.