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

TypedArray.prototype.reduce()

Methode

Reduziert ein typisiertes Array von links nach rechts auf einen einzigen Wert, indem eine Reducer-Funktion auf jedes Element angewendet wird.

seit JavaScript ES2015 Kategorie: method-property

Signatur

TypedArray.prototype.reduce(callbackFn, initialValue)

Beschreibung

Die Methode reduce() von TypedArray-Instanzen (z. B. Uint8Array, Float32Array, BigInt64Array) ruft für jedes Element der Reihe nach eine Reducer-Funktion auf. Der Rückgabewert eines Aufrufs wird als Akkumulator an den nächsten Aufruf übergeben. Am Ende steht ein einziger Wert, zum Beispiel eine Summe, ein Maximum, eine Prüfsumme oder ein beliebiges Objekt.

Der Algorithmus ist derselbe wie bei Array.prototype.reduce(). Da typisierte Arrays keine Lücken haben, wird jeder Index von 0 bis length - 1 besucht. Wird initialValue angegeben, startet der Akkumulator mit diesem Wert und die Verarbeitung beginnt bei Index 0. Ohne initialValue ist das erste Element der Startwert und die Verarbeitung beginnt bei Index 1.

Der Akkumulator ist nicht an den Elementtyp gebunden. Die Methode liefert also keine abgeschnittenen oder umgewandelten Werte. Eine Summe über ein Uint8Array kann deshalb problemlos größer als 255 werden, weil sie als normale JavaScript-Zahl berechnet wird. Das macht reduce() gut geeignet, um Binärdaten auszuwerten, etwa Pixelpuffer, Audio-Samples oder Sensorwerte.

Parameter

Name Typ Default Beschreibung
$callbackFn Pflicht (accumulator: any, currentValue: number|bigint, currentIndex: number, array: TypedArray) => any Wird für jedes Element aufgerufen. Der Rückgabewert wird beim nächsten Aufruf zum accumulator. Die Funktion erhält: accumulator (bisheriges Ergebnis), currentValue (aktuelles Element), currentIndex (Index des Elements) und array (das typisierte Array selbst).
$initialValue any erstes Element Startwert des Akkumulators. Fehlt er, wird das erste Element verwendet und die Verarbeitung beginnt bei Index 1.

Rückgabewert

Typ
any
Beschreibung
Der Wert, der beim letzten Aufruf von callbackFn zurückgegeben wurde. Er kann einen beliebigen Typ haben.

Beispiele

Summe aller Bytes eines Puffers

const bytes = new Uint8Array([200, 100, 50, 10]);

// Akkumulator ist eine normale Zahl – kein Überlauf bei 255
const summe = bytes.reduce((acc, wert) => acc + wert, 0);
console.log(summe);
360

Durchschnittliche Helligkeit eines RGBA-Pixelpuffers

// 2 Pixel: Rot und Weiß (RGBA)
const pixel = new Uint8ClampedArray([255, 0, 0, 255, 255, 255, 255, 255]);

const helligkeit = pixel.reduce((acc, wert, i) => {
  // Alpha-Kanal (jeder 4. Wert) überspringen
  return i % 4 === 3 ? acc : acc + wert;
}, 0) / (pixel.length / 4 * 3);

console.log(helligkeit.toFixed(1));
170.0

Minimum und Maximum von Messwerten in einem Durchlauf

const messwerte = new Float32Array([21.5, 19.25, 23.75, 20]);

const { min, max } = messwerte.reduce(
  (acc, wert) => ({
    min: Math.min(acc.min, wert),
    max: Math.max(acc.max, wert),
  }),
  { min: Infinity, max: -Infinity }
);

console.log(min, max);
19.25 23.75

BigInt64Array aufsummieren

const groß = new BigInt64Array([9007199254740993n, 10n]);

// Startwert muss ein BigInt sein – Mischen mit Number wirft TypeError
const total = groß.reduce((acc, wert) => acc + wert, 0n);
console.log(total);
9007199254741003n

// Wichtig · Fallstricke

  • Leeres Array ohne Startwert: new Uint8Array(0).reduce((a, b) => a + b) wirft einen TypeError. Gib deshalb immer einen initialValue an, wenn das Array leer sein kann.
  • BigInt-Arrays: Bei BigInt64Array und BigUint64Array sind die Elemente vom Typ bigint. Ein Startwert wie 0 (Number) führt zu TypeError: Cannot mix BigInt and other types. Verwende stattdessen 0n.
  • Gleitkomma-Genauigkeit: Werte aus einem Float32Array werden beim Lesen in 64-Bit-Zahlen umgewandelt. Zum Beispiel wird 0.1 zu 0.10000000149011612. Das kann Summen leicht verfälschen.
  • Kein Typ-Clamping: Der Akkumulator wird nicht auf den Wertebereich des Elementtyps begrenzt. Das ist erwünscht, überrascht aber, wenn man ein Überlaufverhalten wie in C erwartet.
  • Abgekoppelter oder verkleinerter Puffer: Wird der zugrunde liegende ArrayBuffer während der Iteration übertragen (z. B. per postMessage) oder verkleinert, liefern Zugriffe auf fehlende Indizes undefined. Ist der Puffer schon beim Aufruf abgekoppelt, wirft die Methode einen TypeError.
  • Die Methode ist nicht generisch. Sie funktioniert nur auf echten TypedArray-Instanzen, nicht auf array-ähnlichen Objekten.
  • Kompatibilität: Wird in allen modernen Browsern und seit Node.js 4 unterstützt (Baseline).