Signatur
Beschreibung
Iterator.from() ist eine statische Methode des globalen Iterator-Objekts. Sie nimmt ein iterierbares Objekt (etwas mit [Symbol.iterator](), z. B. Array, Set, Map, NodeList, String) oder einen Iterator (ein Objekt mit einer next()-Methode) entgegen und gibt ein Objekt zurück, das von Iterator.prototype erbt. Damit stehen die Iterator-Hilfsmethoden aus ES2025 zur Verfügung: map(), filter(), take(), drop(), flatMap(), reduce(), toArray(), forEach(), some(), every() und find().
Der Ablauf ist genau festgelegt: Hat das Argument eine Methode [Symbol.iterator], wird sie aufgerufen und ihr Ergebnis verwendet. Andernfalls wird das Argument selbst als Iterator behandelt. Erbt der so erhaltene Iterator bereits von Iterator.prototype (wie alle eingebauten Iteratoren und Generator-Objekte), gibt Iterator.from() genau dieses Objekt zurück. Nur bei „fremden“ Iteratoren, etwa selbstgebauten Objekten mit next() oder Iteratoren aus älteren Bibliotheken, wird ein schlanker Wrapper erzeugt, der next() und return() weiterreicht.
Praktisch nützlich ist das vor allem in zwei Fällen: wenn du Iterator-Objekte ohne passende Prototypkette (etwa aus Bibliotheken, die vor ES2025 entstanden sind) mit den neuen Hilfsmethoden verarbeiten willst, oder wenn du iterierbare Objekte wie Set oder NodeList verzögert (lazy) verarbeiten willst, ohne vorher mit Array.from() ein Zwischen-Array anzulegen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $object Pflicht | Iterable | Iterator | string | Ein iterierbares Objekt (mit [Symbol.iterator]()), ein Objekt mit next()-Methode oder ein String. Andere primitive Werte (number, null, undefined …) lösen einen TypeError aus. |
Rückgabewert
Iterator.prototype erbt. Erbt der zugrunde liegende Iterator bereits davon, wird er unverändert zurückgegeben (gleiche Identität). Sonst kommt ein Wrapper-Objekt zurück, das next() und return() an den Original-Iterator weiterreicht.Beispiele
Selbstgebauten Iterator mit Hilfsmethoden ausstatten
// Iterator-Objekt ohne Iterator.prototype in der Prototypkette
const zaehler = {
i: 0,
next() {
return this.i < 5
? { value: this.i++, done: false }
: { value: undefined, done: true };
},
};
// zaehler.map(...) gäbe einen TypeError, weil die Methode fehlt
const ergebnis = Iterator.from(zaehler)
.filter((n) => n % 2 === 0)
.map((n) => n * 10)
.toArray();
console.log(ergebnis);
Set und String verzögert verarbeiten, ohne Zwischen-Array
const tags = new Set(['js', 'css', 'html', 'node', 'deno']);
const ersteDrei = Iterator.from(tags)
.map((t) => t.toUpperCase())
.take(3)
.toArray();
console.log(ersteDrei);
// Strings werden nach Unicode-Codepoints durchlaufen
console.log(Iterator.from('a😀b').toArray());
Identität: eingebaute Iteratoren werden nicht verpackt
const arrIter = [1, 2, 3][Symbol.iterator]();
console.log(Iterator.from(arrIter) === arrIter);
function* gen() { yield 1; }
const g = gen();
console.log(Iterator.from(g) === g);
const fremd = { next: () => ({ done: true, value: undefined }) };
console.log(Iterator.from(fremd) === fremd);
DOM-Praxis: externe Links aus einer NodeList filtern
// Im Browser ausführen
const externeLinks = Iterator.from(document.querySelectorAll('a[href]'))
.filter((a) => a.hostname !== location.hostname)
.map((a) => a.href)
.take(10)
.toArray();
console.log(externeLinks);
// Wichtig · Fallstricke
- Kompatibilität: Iterator Helpers gehören zu ES2025 und sind erst seit 2025 in allen großen Browsern verfügbar (Safari erst ab 18.4). Für ältere Umgebungen brauchst du ein Polyfill wie
core-jsoderes-iterator-helpers. Prüfen kannst du mittypeof Iterator?.from === 'function'. - Keine Validierung von
next:Iterator.from({})wirft keinen Fehler. DerTypeErrortritt erst beim ersten Aufruf vonnext()auf, weilnextdannundefinedist. - Primitive Werte: Nur Strings sind als primitives Argument erlaubt.
Iterator.from(42)oderIterator.from(null)werfen sofort einenTypeError. - Keine Kopie: Das Ergebnis teilt sich den Zustand mit dem Original-Iterator. Was einer der beiden verbraucht, ist für den anderen weg. Iteratoren lassen sich nur einmal durchlaufen. Wenn du die Daten mehrfach brauchst, lege mit
toArray()ein Array an. - Nicht für asynchrone Iteratoren: Für asynchrone Iterables gibt es
Iterator.from()nicht in einer passenden Variante (AsyncIterator.fromist noch ein Vorschlag). Für asynchrone Datenquellen nutzt duArray.fromAsync()oderfor await...of. - Nicht mit
Array.from()verwechseln:Array.from()legt sofort ein vollständiges Array an.Iterator.from()arbeitet verzögert und eignet sich deshalb auch für unendliche Quellen, zusammen mittake().