Signatur
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
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);
}
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'));
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);
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);
// 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 mityield*. - Keine Primitive:
Iterator.concat('abc')wirft einenTypeError, 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.