Signatur
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
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);
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));
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);
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);
// Wichtig · Fallstricke
- Leeres Array ohne Startwert:
new Uint8Array(0).reduce((a, b) => a + b)wirft einenTypeError. Gib deshalb immer eineninitialValuean, wenn das Array leer sein kann. - BigInt-Arrays: Bei
BigInt64ArrayundBigUint64Arraysind die Elemente vom Typbigint. Ein Startwert wie0(Number) führt zuTypeError: Cannot mix BigInt and other types. Verwende stattdessen0n. - Gleitkomma-Genauigkeit: Werte aus einem
Float32Arraywerden beim Lesen in 64-Bit-Zahlen umgewandelt. Zum Beispiel wird0.1zu0.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
ArrayBufferwährend der Iteration übertragen (z. B. perpostMessage) oder verkleinert, liefern Zugriffe auf fehlende Indizesundefined. Ist der Puffer schon beim Aufruf abgekoppelt, wirft die Methode einenTypeError. - 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).