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

Iterator.prototype.toArray()

Methode

Liest einen Iterator vollständig aus und gibt alle gelieferten Werte als neues <code>Array</code> zurück.

seit JavaScript ES2025 (Iterator Helpers); Chrome 122+, Edge 122+, Kategorie: method-property

Signatur

Iterator.prototype.toArray()

Beschreibung

Die Methode toArray() gehört zu den Iterator-Helfern. Sie ruft so lange next() auf dem Iterator auf, bis dieser done: true meldet, und sammelt dabei jeden Wert in einem neuen Array. Danach ist der Iterator verbraucht.

Gedacht ist sie vor allem als Abschluss einer Kette aus fauler Verarbeitung (map(), filter(), take(), drop(), flatMap()). Die Zwischenschritte erzeugen keine Arrays. Erst toArray() wertet die Kette aus und liefert das Ergebnis als normales Array, auf dem du dann Array-Methoden wie sort(), at() oder length nutzen kannst.

Das Ergebnis entspricht [...iterator] oder Array.from(iterator). Der Unterschied: toArray() steht direkt als Methode am Ende einer Kette und liest sich dadurch flüssiger. Für Objekte, die nur iterierbar sind, aber nicht von Iterator.prototype erben, gibt es diese Methode nicht. Solche Objekte wandelst du vorher mit Iterator.from() um.

Rückgabewert

Typ
Array
Beschreibung
Ein neues Array mit allen Werten, die der Iterator geliefert hat, in der Reihenfolge ihrer Ausgabe. Bei einem leeren oder bereits verbrauchten Iterator ist es ein leeres Array [].

Beispiele

Generator vollständig in ein Array umwandeln

function* zaehleBis(n) {
  for (let i = 1; i <= n; i++) yield i;
}

const zahlen = zaehleBis(5).toArray();
console.log(zahlen);
console.log(Array.isArray(zahlen));
[1, 2, 3, 4, 5] true

Faule Kette aus Iterator-Helfern auswerten

function* natuerlicheZahlen() {
  let n = 1;
  while (true) yield n++; // unendlicher Generator
}

const ersteGeradeQuadrate = natuerlicheZahlen()
  .filter((n) => n % 2 === 0)
  .map((n) => n * n)
  .take(4)   // begrenzt die Menge, sonst liefe toArray() endlos
  .toArray();

console.log(ersteGeradeQuadrate);
[4, 16, 36, 64]

Map-Einträge filtern und als Array weiterverarbeiten

const lager = new Map([
  ['Äpfel', 12],
  ['Birnen', 0],
  ['Kirschen', 7],
  ['Pflaumen', 0]
]);

const verfuegbar = lager.entries()
  .filter(([, menge]) => menge > 0)
  .map(([name]) => name)
  .toArray()
  .sort();

console.log(verfuegbar);
['Kirschen', 'Äpfel']

Iterator ist nach toArray() verbraucht

const it = ['a', 'b', 'c'].values();

console.log(it.toArray());
console.log(it.toArray()); // zweiter Aufruf: nichts mehr übrig
['a', 'b', 'c'] []

// Wichtig · Fallstricke

  • Unendliche Iteratoren: toArray() liest immer bis zum Ende. Bei einem unendlichen Generator kehrt der Aufruf nie zurück, bis irgendwann der Speicher voll ist. Begrenze die Menge deshalb vorher mit take(n).
  • Einmalig: Der Iterator ist danach verbraucht. Ein zweiter Aufruf gibt [] zurück.
  • Nur für echte Iteratoren: Die Methode ist nur vorhanden, wenn das Objekt von Iterator.prototype erbt. Das trifft auf eingebaute Iteratoren und Generatoren zu. Ein Array selbst hat kein toArray(). Für eigene oder fremde Iteratoren nutzt du Iterator.from(obj).toArray().
  • Keine asynchrone Variante: Asynchrone Iteratoren und Async-Generatoren werden nicht unterstützt. Dafür gibt es Array.fromAsync().
  • Fehler: Wirft next() einen Fehler, wird er weitergereicht, und du bekommst kein Teilergebnis.
  • Kompatibilität: Die Methode ist relativ neu (Iterator Helpers, ES2025). Für ältere Browser oder ältere Node.js-Versionen brauchst du ein Polyfill, z. B. aus core-js, oder du greifst auf Array.from(iterator) zurück.