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

Iterator.concat()

Methode

Die statische Methode <code>Iterator.concat()</code> erzeugt einen neuen Iterator, der die Werte mehrerer iterierbarer Objekte nacheinander liefert.

seit JavaScript ES2026 (Proposal „Iterator Sequencing“), neuere Br Kategorie: method-property

Signatur

Iterator.concat(...items)

Beschreibung

Iterator.concat() hängt beliebig viele iterierbare Objekte (Arrays, Set, Map, Generatoren, eigene Iterables …) hintereinander und gibt einen einzigen Iterator zurück. Dieser liefert zuerst alle Werte des ersten Arguments, danach alle Werte des zweiten usw. Das ist das iteratorbasierte Gegenstück zu Array.prototype.concat(), allerdings ohne ein Zwischen-Array anzulegen.

Die Verarbeitung ist lazy: Der Iterator eines Arguments wird erst über [Symbol.iterator]() angefordert, wenn der vorherige vollständig durchlaufen ist. Dadurch eignet sich die Methode auch für große oder unendliche Datenquellen, etwa um einem Generator einen festen Kopf- oder Endteil hinzuzufügen. Geprüft wird dagegen sofort beim Aufruf, ob jedes Argument ein Objekt mit aufrufbarer [Symbol.iterator]-Methode ist.

Der zurückgegebene Iterator erbt von Iterator.prototype. Deshalb stehen direkt alle Iterator-Helfer wie map(), filter(), take() oder toArray() zur Verfügung. Wird er vorzeitig beendet (z. B. durch break in einer for...of-Schleife), ruft er return() auf dem gerade aktiven inneren Iterator auf, sodass dieser Ressourcen freigeben kann.

Parameter

Name Typ Default Beschreibung
$...items Iterable<T>[] Beliebig viele iterierbare Objekte, die der Reihe nach durchlaufen werden. Jedes muss eine aufrufbare [Symbol.iterator]-Methode besitzen. Primitive Werte wie Strings sind nicht erlaubt. Ohne Argumente entsteht ein leerer Iterator.

Rückgabewert

Typ
Iterator<T>
Beschreibung
Ein neues Iterator-Helper-Objekt (erbt von Iterator.prototype), das die Werte aller übergebenen Iterables nacheinander liefert.

Beispiele

Arrays und Set ohne Zwischen-Array verbinden

const standard = ['admin', 'editor'];
const extra = new Set(['gast', 'moderator']);

for (const rolle of Iterator.concat(standard, extra, ['support'])) {
  console.log(rolle);
}
admin editor gast moderator support

Generator mit Kopf- und Endzeile versehen (lazy)

function* datenzeilen() {
  console.log('Generator startet');
  yield 'Anna;42';
  yield 'Ben;37';
}

const csv = Iterator.concat(['Name;Alter'], datenzeilen(), ['# Ende']);
console.log('Iterator erzeugt');
console.log(csv.toArray().join('\n'));
Iterator erzeugt Generator startet Name;Alter Anna;42 Ben;37 # Ende

Mit Iterator-Helfern kombinieren

const lager1 = new Map([['Apfel', 3], ['Birne', 0]]);
const lager2 = new Map([['Kiwi', 5], ['Mango', 2]]);

const verfuegbar = Iterator.concat(lager1, lager2)
  .filter(([, menge]) => menge > 0)
  .map(([name]) => name)
  .toArray();

console.log(verfuegbar);
[ 'Apfel', 'Kiwi', 'Mango' ]

Strings und Feature-Erkennung

// Strings sind primitiv und werden abgelehnt
try {
  Iterator.concat('abc');
} catch (e) {
  console.log(e.constructor.name);
}

// Lösung: in ein Array verpacken bzw. als Zeichen-Iterable übergeben
const zeichen = typeof Iterator?.concat === 'function'
  ? Iterator.concat([...'ab'], ['c']).toArray()
  : [...'ab', 'c'];
console.log(zeichen);
TypeError [ 'a', 'b', 'c' ]

// Wichtig · Fallstricke

  • Kompatibilität: Neu mit ES2026 und bisher nur in aktuellen Browser- und Laufzeitversionen vorhanden. Vorher per typeof Iterator?.concat === 'function' prüfen oder ein Polyfill (z. B. core-js) einsetzen. Als Alternative eignet sich ein Generator mit yield*.
  • Keine Primitive: Iterator.concat('abc') wirft einen TypeError, obwohl Strings iterierbar sind. Das gilt auch für Argumente ohne [Symbol.iterator], etwa reine Iteratoren ohne diese Methode oder normale Objekte. Die Prüfung findet sofort beim Aufruf statt, nicht erst beim Durchlaufen.
  • Einmal verwendbar: Wie jeder Iterator lässt sich das Ergebnis nur einmal durchlaufen. Übergebene Generatoren werden dabei verbraucht. Soll dieselbe Quelle mehrfach vorkommen, muss sie ein wiederholt iterierbares Objekt sein, etwa ein Array.
  • Keine Verschachtelung: Die Werte werden unverändert weitergegeben. Arrays in Arrays werden also nicht aufgelöst, dafür ist flatMap() gedacht.
  • Laufzeitfehler innerhalb der inneren Iteratoren werden an den Aufrufer weitergereicht.