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

TypedArray.prototype.entries()

Methode

Gibt einen neuen Array-Iterator zurück, der für jeden Index des typisierten Arrays ein <code>[index, wert]</code>-Paar liefert.

seit JavaScript ES2015 Kategorie: method-property

Signatur

TypedArray.prototype.entries()

Beschreibung

Die Methode entries() ist auf allen typisierten Arrays verfügbar, etwa Uint8Array, Int32Array, Float64Array oder BigInt64Array. Sie gibt ein neues Array-Iterator-Objekt zurück. Dieses liefert nacheinander zweielementige Arrays der Form [index, wert]. Der Algorithmus ist derselbe wie bei Array.prototype.entries().

Am häufigsten nutzt man sie zusammen mit for...of und Destrukturierung: So hat man in einer Schleife gleichzeitig Zugriff auf Index und Wert, ohne einen Zähler von Hand zu führen. Das ist praktisch, wenn man Binärdaten (Pixelpuffer, Audio-Samples, Netzwerkpakete) nach bestimmten Positionen durchsucht oder Werte mit ihrer Position protokolliert.

Der Iterator wird verzögert ausgewertet: Er liest die Werte erst beim Aufruf von next() aus dem zugrunde liegenden ArrayBuffer. Änderungen am Array während der Iteration sind daher sichtbar. Der Iterator ist außerdem nur einmal verwendbar. Ist er erschöpft, braucht man für einen neuen Durchlauf einen neuen Aufruf von entries().

Rückgabewert

Typ
ArrayIterator<[number, number | bigint]>
Beschreibung
Ein neues, iterierbares Iterator-Objekt. Jeder Schritt liefert ein Array [index, wert]. Bei BigInt64Array und BigUint64Array ist der Wert ein bigint.

Beispiele

Index und Wert mit for...of durchlaufen

const samples = new Float32Array([0.5, -0.25, 1, 0]);

for (const [index, value] of samples.entries()) {
  console.log(`Sample ${index}: ${value}`);
}
Sample 0: 0.5 Sample 1: -0.25 Sample 2: 1 Sample 3: 0

Iterator manuell mit next() abfragen

const bytes = new Uint8Array([10, 20]);
const it = bytes.entries();

console.log(it.next()); // erstes Paar
console.log(it.next()); // zweites Paar
console.log(it.next()); // erschöpft
{ value: [0, 10], done: false } { value: [1, 20], done: false } { value: undefined, done: true }

Positionen übersteuerter Pixelwerte finden

const pixels = new Uint8ClampedArray([12, 255, 80, 255, 0, 200]);

// Alle Indizes mit Maximalwert 255 sammeln
const clipped = [...pixels.entries()]
  .filter(([, value]) => value === 255)
  .map(([index]) => index);

console.log(clipped);
[1, 3]

In eine Map umwandeln

const ids = new Int16Array([-3, 7, 42]);
const map = new Map(ids.entries());

console.log(map.get(2));
console.log(map.size);
42 3

// Wichtig · Fallstricke

  • Einmal verwendbar: Ein Iterator ist nach einem Durchlauf erschöpft. Wird er ein zweites Mal in for...of oder mit Spread verwendet, entstehen keine Werte mehr. Für jeden Durchlauf entries() neu aufrufen.
  • Verzögertes Lesen: Werte werden erst bei next() gelesen. Schreibt man während der Iteration in das Array, sieht der Iterator die neuen Werte.
  • Abgelöste Puffer: Wird der zugrunde liegende ArrayBuffer abgelöst (z. B. per postMessage mit Transfer oder ArrayBuffer.prototype.transfer()), wirft der Aufruf von entries() einen TypeError. Wird der Puffer erst während der Iteration abgelöst, wirft auch das nächste next() einen TypeError.
  • Performance: Für jedes Element wird ein neues Array [index, wert] erzeugt. In rechenintensiven Schleifen über große Puffer ist eine klassische for-Schleife mit Index deutlich schneller.
  • BigInt-Arrays: Bei BigInt64Array und BigUint64Array sind die Werte vom Typ bigint und lassen sich nicht direkt mit number mischen.
  • Unterstützt von allen modernen Browsern und Node.js seit ES2015 (Baseline).