Start · Sprachen · JavaScript · Referenz · Array.prototype.entries()

Array.prototype.entries()

Methode

Gibt ein neues Array-Iterator-Objekt zurück, das für jeden Index des Arrays ein <code>[index, wert]</code>-Paar liefert.

seit JavaScript ES2015 Kategorie: method-property

Signatur

Array.prototype.entries()

Beschreibung

entries() gibt einen Array-Iterator zurück. Jeder Schritt liefert ein zweielementiges Array [index, wert]. So kommt man in einer for...of-Schleife gleichzeitig an Index und Wert, ohne einen eigenen Zähler zu führen.

Das ist praktisch, wenn der Index gebraucht wird, man aber trotzdem break, continue oder await einsetzen will. Mit forEach() geht das nicht. Mit Destrukturierung liest sich das kurz: for (const [i, wert] of arr.entries()).

Der Iterator ist lazy und live: Er erzeugt die Paare erst beim Durchlaufen und liest dabei den aktuellen Zustand des Arrays. Lücken in dünn besetzten Arrays (sparse arrays) werden nicht übersprungen, sondern als undefined geliefert. Die Methode ist generisch und funktioniert über Array.prototype.entries.call() auch mit array-ähnlichen Objekten, also Objekten mit length und numerischen Schlüsseln.

Rückgabewert

Typ
Array Iterator (IterableIterator<[number, T]>)
Beschreibung
Ein neues, iterierbares Iterator-Objekt. Jeder Aufruf von next() gibt { value: [index, element], done: false } zurück. Nach dem letzten Element folgt { value: undefined, done: true }.

Beispiele

Index und Wert in for...of

const obst = ['Apfel', 'Birne', 'Kirsche'];

for (const [index, name] of obst.entries()) {
  console.log(`${index + 1}. ${name}`);
}
1. Apfel 2. Birne 3. Kirsche

Iterator manuell mit next() durchlaufen

const iterator = ['a', 'b'].entries();

console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
{ value: [0, 'a'], done: false } { value: [1, 'b'], done: false } { value: undefined, done: true }

Erste ungültige Zeile finden und abbrechen

const zeilen = ['42', '17', 'abc', '8'];

for (const [zeile, wert] of zeilen.entries()) {
  if (Number.isNaN(Number(wert))) {
    console.log(`Fehler in Zeile ${zeile}: "${wert}"`);
    break; // mit forEach nicht möglich
  }
}
Fehler in Zeile 2: "abc"

Sparse Arrays und array-ähnliche Objekte

// Lücken werden als undefined geliefert
console.log([...['x', , 'z'].entries()]);

// Generische Verwendung mit einem array-ähnlichen Objekt
const arrayLike = { length: 2, 0: 'rot', 1: 'grün' };
console.log([...Array.prototype.entries.call(arrayLike)]);
[ [0, 'x'], [1, undefined], [2, 'z'] ] [ [0, 'rot'], [1, 'grün'] ]

// Wichtig · Fallstricke

  • Kein Array: Der Rückgabewert ist ein Iterator, kein Array. .map() oder .length gibt es darauf nicht, und console.log(arr.entries()) zeigt nur Object [Array Iterator] {}. Wer ein Array braucht, schreibt [...arr.entries()] oder Array.from(arr.entries()). Neuere Laufzeitumgebungen bieten dafür auch Iterator-Helfer wie .map() und .filter() direkt am Iterator (ES2025).
  • Nur einmal verwendbar: Ein durchlaufener Iterator ist erschöpft. Für einen zweiten Durchlauf entries() erneut aufrufen.
  • Live-Verhalten: Wird das Array während des Durchlaufs verändert (z. B. mit push), sieht der Iterator die Änderung. Das kann zu Endlosschleifen führen.
  • Unterschied zu Object.entries(): Object.entries(arr) liefert ein echtes Array mit String-Schlüsseln (['0', 'a']) und überspringt Lücken. arr.entries() liefert Zahlen-Indizes und schließt Lücken ein.
  • Kompatibilität: Wird von allen modernen Browsern und von Node.js ab Version 0.12 unterstützt, aber nicht vom Internet Explorer.