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

Iterator.zipKeyed()

Methode

Fasst mehrere Iterables schrittweise zusammen und liefert pro Position ein Objekt, dessen Schlüssel den Schlüsseln des Eingabe-Objekts entsprechen.

seit JavaScript TC39-Proposal „Joint Iteration“ (Stage 3), noch ni Kategorie: method-property

Signatur

Iterator.zipKeyed(iterables, options)

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 aus padding ergänzt, sonst mit undefined.
  • "strict": Haben die Eingaben nicht alle dieselbe Länge, wird ein TypeError geworfen.

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

Typ
Iterator<Object>
Beschreibung
Ein neuer Iterator-Helper. Er liefert pro Schritt ein Objekt ohne Prototyp (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}`);
}
Anna (34) aus Berlin Ben (28) aus Köln Clara (41) aus Hamburg

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));
[{"product":"Tee","price":2.5},{"product":"Kaffee","price":3.2},{"product":"Kakao","price":0}]

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
}
true

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);
[ '1. Einkaufen', '2. Putzen', '3. Lernen' ]

// 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 mit typeof Iterator.zipKeyed === 'function' oder verwende ein Polyfill, z. B. aus core-js.
  • Objekte ohne Prototyp: Die gelieferten Objekte haben keinen Prototyp. Methoden wie row.hasOwnProperty() oder row.toString() gibt es daher nicht, und die Konsole zeigt sie als [Object: null prototype] an. Verwende stattdessen Object.hasOwn() oder kopiere die Werte mit { ...row } in ein normales Objekt.
  • Strings werden abgelehnt: Übergibst du einen String als Eigenschaftswert, wird ein TypeError geworfen. 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 break oder take(), oder tritt ein Fehler auf, wird auf den noch offenen Iteratoren return() aufgerufen. Generatoren werden dadurch ordentlich geschlossen.
  • Die Option padding wirkt nur bei mode: "longest". In den anderen Modi wird sie ignoriert.