Array.prototype.reduceRight()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Die reduceRight()
-Methode von Array
-Instanzen wendet eine Funktion auf einen Akkumulator und jeden Wert des Arrays (von rechts nach links) an, um es auf einen einzelnen Wert zu reduzieren.
Siehe auch Array.prototype.reduce()
für von links nach rechts.
Probieren Sie es aus
const array1 = [
[0, 1],
[2, 3],
[4, 5],
];
const result = array1.reduceRight((accumulator, currentValue) =>
accumulator.concat(currentValue),
);
console.log(result);
// Expected output: Array [4, 5, 2, 3, 0, 1]
Syntax
reduceRight(callbackFn)
reduceRight(callbackFn, initialValue)
Parameter
callbackFn
-
Eine Funktion, die für jedes Element im Array ausgeführt wird. Ihr Rückgabewert wird der Wert des
accumulator
-Parameters beim nächsten Aufruf voncallbackFn
. Beim letzten Aufruf wird der Rückgabewert zum Rückgabewert vonreduceRight()
. Die Funktion wird mit folgenden Argumenten aufgerufen:accumulator
-
Der Wert, der sich aus dem vorherigen Aufruf von
callbackFn
ergibt. Beim ersten Aufruf entspricht sein WertinitialValue
, falls letzteres angegeben ist, andernfalls entspricht sein Wert dem letzten Element des Arrays. currentValue
-
Der Wert des aktuellen Elements. Beim ersten Aufruf entspricht sein Wert dem letzten Element, falls
initialValue
angegeben ist, andernfalls dem vorletzten Element. currentIndex
-
Die Indexposition von
currentValue
im Array. Beim ersten Aufruf entspricht sein Wertarray.length - 1
, fallsinitialValue
angegeben ist, andernfallsarray.length - 2
. array
-
Das Array, auf dem
reduceRight()
aufgerufen wurde.
initialValue
Optional-
Ein Wert, der als Akkumulator beim ersten Aufruf von
callbackFn
verwendet wird. Wenn kein Anfangswert angegeben wird, wird das letzte Element im Array verwendet und übersprungen. WirdreduceRight()
auf einem leeren Array ohne Anfangswert aufgerufen, wird einTypeError
ausgelöst.
Rückgabewert
Der Wert, der aus der Reduktion resultiert.
Beschreibung
Die Methode reduceRight()
ist eine iterative Methode. Sie führt eine "Reducer"-Callback-Funktion für alle Elemente im Array in absteigender Index-Reihenfolge aus und akkumuliert sie zu einem einzigen Wert. Lesen Sie den Abschnitt zu iterativen Methoden, um mehr darüber zu erfahren, wie diese Methoden im Allgemeinen funktionieren.
callbackFn
wird nur für Array-Indizes aufgerufen, die Werte zugewiesen haben. Es wird nicht für leere Stellen in spärlichen Arrays aufgerufen.
Im Gegensatz zu anderen iterativen Methoden akzeptiert reduceRight()
kein thisArg
-Argument. callbackFn
wird immer mit undefined
als this
aufgerufen, was durch globalThis
ersetzt wird, wenn callbackFn
nicht strict ist.
Die Methode reduceRight()
ist generisch. Sie erwartet lediglich, dass der this
-Wert eine length
-Eigenschaft und integerbasierte Schlüssel besitzt.
Alle Hinweise zu reduce
, die in when to not use reduce() besprochen werden, gelten auch für reduceRight
. Da JavaScript keine Lazy-Evaluation-Semantik hat, besteht kein Leistungsunterschied zwischen reduce
und reduceRight
.
Beispiele
Wie reduceRight() ohne Anfangswert funktioniert
Der Aufruf des reduceRight
-callbackFn
würde ungefähr so aussehen:
arr.reduceRight((accumulator, currentValue, index, array) => {
// …
});
Beim ersten Aufruf der Funktion können accumulator
und currentValue
zwei mögliche Werte haben. Wenn beim Aufruf von reduceRight
ein initialValue
angegeben wurde, ist accumulator
gleich initialValue
und currentValue
gleich dem letzten Wert im Array. Wenn kein initialValue
angegeben wurde, ist accumulator
gleich dem letzten Wert im Array, und currentValue
ist gleich dem vorletzten Wert.
Falls das Array leer ist und kein initialValue
angegeben wurde, wird ein TypeError
ausgelöst. Falls das Array nur ein Element enthält (unabhängig von der Position) und kein initialValue
angegeben wurde, oder wenn initialValue
angegeben wurde, aber das Array leer ist, wird der Solo-Wert zurückgegeben, ohne dass callbackFn
aufgerufen wird.
Einige Beispiel-Durchläufe der Funktion sehen wie folgt aus:
[0, 1, 2, 3, 4].reduceRight(
(accumulator, currentValue, index, array) => accumulator + currentValue,
);
Der Callback würde viermal aufgerufen, wobei die Argumente und Rückgabewerte in jedem Aufruf wie folgt sind:
accumulator |
currentValue |
index |
Rückgabewert | |
---|---|---|---|---|
Erster Aufruf | 4 |
3 |
3 |
7 |
Zweiter Aufruf | 7 |
2 |
2 |
9 |
Dritter Aufruf | 9 |
1 |
1 |
10 |
Vierter Aufruf | 10 |
0 |
0 |
10 |
Der array
-Parameter ändert sich während des Prozesses nie – es bleibt immer [0, 1, 2, 3, 4]
. Der durch reduceRight
zurückgegebene Wert wäre der des letzten Callback-Aufrufs (10
).
Wie reduceRight() mit einem Anfangswert funktioniert
Hier reduzieren wir dasselbe Array mit demselben Algorithmus, aber mit einem initialValue
von 10
, das als zweiter Parameter an reduceRight()
übergeben wird:
[0, 1, 2, 3, 4].reduceRight(
(accumulator, currentValue, index, array) => accumulator + currentValue,
10,
);
accumulator |
currentValue |
index |
Rückgabewert | |
---|---|---|---|---|
Erster Aufruf | 10 |
4 |
4 |
14 |
Zweiter Aufruf | 14 |
3 |
3 |
17 |
Dritter Aufruf | 17 |
2 |
2 |
19 |
Vierter Aufruf | 19 |
1 |
1 |
20 |
Fünfter Aufruf | 20 |
0 |
0 |
20 |
Der durch reduceRight
zurückgegebene Wert wäre diesmal, selbstverständlich, 20
.
Summieren aller Werte in einem Array
const sum = [0, 1, 2, 3].reduceRight((a, b) => a + b);
// sum is 6
Eine Liste asynchroner Funktionen mit Callbacks seriell ausführen, wobei die Ergebnisse jeweils an die nächste übergeben werden
const waterfall =
(...functions) =>
(callback, ...args) =>
functions.reduceRight(
(composition, fn) =>
(...results) =>
fn(composition, ...results),
callback,
)(...args);
const randInt = (max) => Math.floor(Math.random() * max);
const add5 = (callback, x) => {
setTimeout(callback, randInt(1000), x + 5);
};
const mult3 = (callback, x) => {
setTimeout(callback, randInt(1000), x * 3);
};
const sub2 = (callback, x) => {
setTimeout(callback, randInt(1000), x - 2);
};
const split = (callback, x) => {
setTimeout(callback, randInt(1000), x, x);
};
const add = (callback, x, y) => {
setTimeout(callback, randInt(1000), x + y);
};
const div4 = (callback, x) => {
setTimeout(callback, randInt(1000), x / 4);
};
const computation = waterfall(add5, mult3, sub2, split, add, div4);
computation(console.log, 5); // Logs 14
// same as:
const computation2 = (input, callback) => {
const f6 = (x) => div4(callback, x);
const f5 = (x, y) => add(f6, x, y);
const f4 = (x) => split(f5, x);
const f3 = (x) => sub2(f4, x);
const f2 = (x) => mult3(f3, x);
add5(f2, input);
};
Unterschied zwischen reduce und reduceRight
const a = ["1", "2", "3", "4", "5"];
const left = a.reduce((prev, cur) => prev + cur);
const right = a.reduceRight((prev, cur) => prev + cur);
console.log(left); // "12345"
console.log(right); // "54321"
Definieren von zusammensetzbaren Funktionen
Funktionskomposition ist ein Mechanismus zum Kombinieren von Funktionen, bei dem die Ausgabe jeder Funktion an die nächste übergeben wird, und die Ausgabe der letzten Funktion das Endergebnis ist. In diesem Beispiel verwenden wir reduceRight()
, um eine Funktionskomposition zu implementieren.
Siehe auch Function composition auf Wikipedia.
const compose =
(...args) =>
(value) =>
args.reduceRight((acc, fn) => fn(acc), value);
// Increment passed number
const inc = (n) => n + 1;
// Doubles the passed value
const double = (n) => n * 2;
// using composition function
console.log(compose(double, inc)(2)); // 6
// using composition function
console.log(compose(inc, double)(2)); // 5
Verwendung von reduceRight() mit spärlichen Arrays
reduceRight()
überspringt fehlende Elemente in spärlichen Arrays, aber es überspringt keine undefined
-Werte.
console.log([1, 2, , 4].reduceRight((a, b) => a + b)); // 7
console.log([1, 2, undefined, 4].reduceRight((a, b) => a + b)); // NaN
Aufruf von reduceRight() auf Nicht-Array-Objekten
Die Methode reduceRight()
liest die length
-Eigenschaft von this
und greift dann auf jede Eigenschaft zu, deren Schlüssel eine nicht-negative Ganzzahl kleiner als length
ist.
const arrayLike = {
length: 3,
0: 2,
1: 3,
2: 4,
3: 99, // ignored by reduceRight() since length is 3
};
console.log(Array.prototype.reduceRight.call(arrayLike, (x, y) => x - y));
// -1, which is 4 - 3 - 2
Spezifikationen
Specification |
---|
ECMAScript® 2025 Language Specification # sec-array.prototype.reduceright |
Browser-Kompatibilität
BCD tables only load in the browser