Signatur
Beschreibung
Iterator.zipKeyed() ist die benannte Variante von Iterator.zip(). Du übergibst statt eines Arrays ein Objekt, dessen Eigenschaften Iterables (oder Iteratoren) sind. Der zurückgegebene Iterator liefert bei jedem Schritt ein neues Objekt mit denselben Schlüsseln. Unter jedem Schlüssel steht das Element, das der zugehörige Iterator an dieser Position geliefert hat.
Gut geeignet ist das für spaltenweise gespeicherte Daten, etwa getrennte Arrays für Namen, Alter und Städte. Aus ihnen machst du lesbare Datensätze, ohne mit Indizes arbeiten zu müssen. Anders als bei Iterator.zip() greifst du auf die Werte über ihren Namen zu (row.name) und nicht über ihre Position (row[0]). Berücksichtigt werden alle eigenen aufzählbaren Schlüssel, also auch Symbol-Schlüssel.
Mit der Option mode legst du fest, was bei unterschiedlich langen Eingaben passiert:
"shortest"(Standard): Die Iteration endet, sobald der erste Iterator erschöpft ist."longest": Die Iteration läuft, bis alle Iteratoren erschöpft sind. Fehlende Werte werden auspaddingergänzt, sonst mitundefined."strict": Haben die Eingaben nicht alle dieselbe Länge, wird einTypeErrorgeworfen.
Die Auswertung ist lazy: Werte werden erst gelesen, wenn du next() aufrufst. Deshalb funktioniert die Methode auch mit unendlichen Iteratoren. Der Rückgabewert ist ein echter Iterator-Helper. Du kannst also direkt .map(), .filter(), .take() oder .toArray() anhängen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $iterables Pflicht | Object<string|symbol, Iterable|Iterator> | Objekt, dessen eigene aufzählbare Eigenschaften Iterables oder Iteratoren sind. Die Schlüssel werden in die Ergebnisobjekte übernommen. Strings werden nicht als Iterable akzeptiert. | |
| $options | Object | {} | Optionales Einstellungsobjekt. |
| $options.mode | "shortest" | "longest" | "strict" | "shortest" | Legt fest, wie mit unterschiedlich langen Eingaben umgegangen wird (siehe Beschreibung). |
| $options.padding | Object | undefined | Nur bei mode: "longest": Objekt mit Ersatzwerten pro Schlüssel für bereits erschöpfte Iteratoren. Fehlt ein Schlüssel, wird undefined verwendet. |
Rückgabewert
Object.create(null)) mit den Schlüsseln aus iterables.Beispiele
Spaltendaten zu Datensätzen zusammenführen
const columns = {
name: ['Anna', 'Ben', 'Clara'],
age: [34, 28, 41],
city: ['Berlin', 'Köln', 'Hamburg']
};
for (const row of Iterator.zipKeyed(columns)) {
console.log(`${row.name} (${row.age}) aus ${row.city}`);
}
Unterschiedliche Längen mit mode: "longest" und padding
const result = Iterator.zipKeyed(
{ product: ['Tee', 'Kaffee', 'Kakao'], price: [2.5, 3.2] },
{ mode: 'longest', padding: { price: 0 } }
).map(obj => ({ ...obj })) // in normale Objekte umwandeln
.toArray();
console.log(JSON.stringify(result));
Längen prüfen mit mode: "strict"
const labels = ['x', 'y', 'z'];
const values = [1, 2];
try {
Iterator.zipKeyed({ label: labels, value: values }, { mode: 'strict' }).toArray();
} catch (err) {
console.log(err instanceof TypeError); // Längen stimmen nicht überein
}
Unendliche Iteratoren kombinieren (lazy)
function* counter() {
let i = 1;
while (true) yield i++;
}
const tasks = ['Einkaufen', 'Putzen', 'Lernen'];
const numbered = Iterator.zipKeyed({ nr: counter(), task: tasks })
.map(({ nr, task }) => `${nr}. ${task}`)
.toArray();
console.log(numbered);
// Wichtig · Fallstricke
- Kompatibilität:
Iterator.zipKeyed()gehört zum TC39-Proposal „Joint Iteration“ und wird bisher nur von einzelnen, aktuellen Engines unterstützt. Prüfe die Verfügbarkeit mittypeof Iterator.zipKeyed === 'function'oder verwende ein Polyfill, z. B. auscore-js. - Objekte ohne Prototyp: Die gelieferten Objekte haben keinen Prototyp. Methoden wie
row.hasOwnProperty()oderrow.toString()gibt es daher nicht, und die Konsole zeigt sie als[Object: null prototype]an. Verwende stattdessenObject.hasOwn()oder kopiere die Werte mit{ ...row }in ein normales Objekt. - Strings werden abgelehnt: Übergibst du einen String als Eigenschaftswert, wird ein
TypeErrorgeworfen. Wandle ihn bei Bedarf vorher um, etwa mit[...str]. - Schlüssel werden nur einmal gelesen: Die Schlüssel werden beim Aufruf erfasst. Spätere Änderungen am
iterables-Objekt haben keine Wirkung mehr. - Aufräumen: Beendest du die Iteration vorzeitig, etwa mit
breakodertake(), oder tritt ein Fehler auf, wird auf den noch offenen Iteratorenreturn()aufgerufen. Generatoren werden dadurch ordentlich geschlossen. - Die Option
paddingwirkt nur beimode: "longest". In den anderen Modi wird sie ignoriert.