Start · Sprachen · JavaScript · Referenz · Iterator.from()

Iterator.from()

Methode

Macht aus einem iterierbaren Objekt oder einem Iterator-ähnlichen Objekt einen echten <code>Iterator</code>, der alle Iterator-Hilfsmethoden wie <code>map()</code>, <code>filter()</code> und <code>take()</code> anbietet.

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

Signatur

Iterator.from(object)

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

Typ
Iterator
Beschreibung
Ein Objekt, das von 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);
[0, 20, 40]

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());
['JS', 'CSS', 'HTML'] ['a', '😀', 'b']

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);
true true false

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);
z. B. ['https://developer.mozilla.org/', ...]

// 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-js oder es-iterator-helpers. Prüfen kannst du mit typeof Iterator?.from === 'function'.
  • Keine Validierung von next: Iterator.from({}) wirft keinen Fehler. Der TypeError tritt erst beim ersten Aufruf von next() auf, weil next dann undefined ist.
  • Primitive Werte: Nur Strings sind als primitives Argument erlaubt. Iterator.from(42) oder Iterator.from(null) werfen sofort einen TypeError.
  • 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.from ist noch ein Vorschlag). Für asynchrone Datenquellen nutzt du Array.fromAsync() oder for 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 mit take().