Array.prototype.reduce()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since иÑÐ»Ñ 2015 г..
ÐеÑод reduce() пÑименÑÐµÑ ÑÑнкÑÐ¸Ñ reducer к ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ ÑлеменÑÑ Ð¼Ð°ÑÑива (Ñлева-напÑаво), возвÑаÑÐ°Ñ Ð¾Ð´Ð½Ð¾ ÑезÑлÑÑиÑÑÑÑее знаÑение.
ÐнÑеÑакÑивнÑй пÑимеÑ
const array1 = [1, 2, 3, 4];
// 0 + 1 + 2 + 3 + 4
const initialValue = 0;
const sumWithInitial = array1.reduce(
(accumulator, currentValue) => accumulator + currentValue,
initialValue,
);
console.log(sumWithInitial);
// Expected output: 10
СинÑакÑиÑ
array.reduce(callback[, initialValue])
ÐаÑамеÑÑÑ
callback-
ФÑнкÑиÑ, вÑполнÑÑÑаÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа маÑÑива, пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑеÑÑÑе аÑгÑменÑа:
accumulator-
ÐккÑмÑлÑÑоÑ, аккÑмÑлиÑÑÑÑий знаÑение, коÑоÑое возвÑаÑÐ°ÐµÑ ÑÑнкÑÐ¸Ñ callback поÑле поÑеÑÐµÐ½Ð¸Ñ Ð¾ÑеÑедного ÑлеменÑа, либо знаÑение
initialValue, еÑли оно пÑедоÑÑавлено (ÑмоÑÑиÑе поÑÑÐ½ÐµÐ½Ð¸Ñ Ð½Ð¸Ð¶Ðµ). currentValue-
ТекÑÑий обÑабаÑÑваемÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива.
indexÐеобÑзаÑелÑнÑй-
ÐÐ½Ð´ÐµÐºÑ ÑекÑÑего обÑабаÑÑваемого ÑлеменÑа маÑÑива.
arrayÐеобÑзаÑелÑнÑй-
ÐаÑÑив, Ð´Ð»Ñ ÐºÐ¾ÑоÑого бÑла вÑзвана ÑÑнкÑиÑ
reduce.
initialValueÐеобÑзаÑелÑнÑй-
ÐеобÑзаÑелÑнÑй паÑамеÑÑ. ÐбÑекÑ, иÑполÑзÑемÑй в каÑеÑÑве пеÑвого аÑгÑменÑа пÑи пеÑвом вÑзове ÑÑнкÑии
callback.
ÐпиÑание
ÐеÑод reduce() вÑполнÑÐµÑ ÑÑнкÑÐ¸Ñ callback один Ñаз Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа, пÑиÑÑÑÑÑвÑÑÑего в маÑÑиве, за иÑклÑÑением пÑÑÑоÑ, пÑÐ¸Ð½Ð¸Ð¼Ð°Ñ ÑеÑÑÑе аÑгÑменÑа: наÑалÑное знаÑение (или знаÑение Ð¾Ñ Ð¿ÑедÑдÑÑего вÑзова callback), знаÑение ÑекÑÑего ÑлеменÑа, ÑекÑÑий Ð¸Ð½Ð´ÐµÐºÑ Ð¸ маÑÑив, по коÑоÑÐ¾Ð¼Ñ Ð¿ÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¸ÑеÑаÑиÑ.
ÐÑи пеÑвом вÑзове ÑÑнкÑии, паÑамеÑÑÑ accumulator и currentValue могÑÑ Ð¿ÑинимаÑÑ Ð¾Ð´Ð½Ð¾ из двÑÑ
знаÑений. ÐÑли пÑи вÑзове reduce() пеÑедан аÑгÑÐ¼ÐµÐ½Ñ initialValue, Ñо знаÑение accumulator бÑÐ´ÐµÑ ÑавнÑм знаÑÐµÐ½Ð¸Ñ initialValue, а знаÑение currentValue бÑÐ´ÐµÑ ÑавнÑм пеÑÐ²Ð¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² маÑÑиве. ÐÑли аÑгÑÐ¼ÐµÐ½Ñ initialValue не задан, Ñо знаÑение accumulator бÑÐ´ÐµÑ ÑавнÑм пеÑÐ²Ð¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² маÑÑиве, а знаÑение currentValue бÑÐ´ÐµÑ ÑавнÑм вÑоÑÐ¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² маÑÑиве.
ÐÑли маÑÑив пÑÑÑой и аÑгÑÐ¼ÐµÐ½Ñ initialValue не Ñказан, бÑÐ´ÐµÑ Ð±ÑоÑено иÑклÑÑение TypeError. ÐÑли маÑÑив ÑоÑÑÐ¾Ð¸Ñ ÑолÑко из одного ÑлеменÑа (незавиÑимо Ð¾Ñ ÐµÐ³Ð¾ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² маÑÑиве) и аÑгÑÐ¼ÐµÐ½Ñ initialValue не Ñказан, или еÑли аÑгÑÐ¼ÐµÐ½Ñ initialValue Ñказан, но маÑÑив пÑÑÑой, Ñо бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑено одно ÑÑо знаÑение, без вÑзова ÑÑнкÑии callback.
ÐÑедположим, ÑÑо reduce() иÑполÑзÑеÑÑÑ ÑледÑÑÑим обÑазом:
[0, 1, 2, 3, 4].reduce(function (previousValue, currentValue, index, array) {
return previousValue + currentValue;
});
ÐолбÑк-ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²Ñзвана ÑеÑÑÑе Ñаза, аÑгÑменÑÑ Ð¸ возвÑаÑаемое знаÑение пÑи каждом вÑзове бÑдÑÑ ÑледÑÑÑими:
previousValue |
currentValue |
index |
array |
возвÑаÑаемое знаÑение | |
|---|---|---|---|---|---|
| пеÑвÑй вÑзов | 0 |
1 |
1 |
[0, 1, 2, 3, 4] |
1 |
| вÑоÑой вÑзов | 1 |
2 |
2 |
[0, 1, 2, 3, 4] |
3 |
| ÑÑеÑий вÑзов | 3 |
3 |
3 |
[0, 1, 2, 3, 4] |
6 |
| ÑеÑвÑÑÑÑй вÑзов | 6 |
4 |
4 |
[0, 1, 2, 3, 4] |
10 |
ÐнаÑение, возвÑаÑÑнное меÑодом reduce() бÑÐ´ÐµÑ ÑавнÑм поÑÐ»ÐµÐ´Ð½ÐµÐ¼Ñ ÑезÑлÑÑаÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð»Ð±Ñк-ÑÑнкÑии â 10.
ÐÑли же Ð²Ñ Ð·Ð°Ð´Ð°Ð´Ð¸Ñе наÑалÑное знаÑение initialValue, ÑезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ Ñак:
[0, 1, 2, 3, 4].reduce(function (accumulator, currentValue, index, array) {
return accumulator + currentValue;
}, 10);
accumulator |
currentValue |
index |
array |
возвÑаÑаемое знаÑение | |
|---|---|---|---|---|---|
| пеÑвÑй вÑзов | 10 |
0 |
0 |
[0, 1, 2, 3, 4] |
10 |
| вÑоÑой вÑзов | 10 |
1 |
1 |
[0, 1, 2, 3, 4] |
11 |
| ÑÑеÑий вÑзов | 11 |
2 |
2 |
[0, 1, 2, 3, 4] |
13 |
| ÑеÑвÑÑÑÑй вÑзов | 13 |
3 |
3 |
[0, 1, 2, 3, 4] |
16 |
| пÑÑÑй вÑзов | 16 |
4 |
4 |
[0, 1, 2, 3, 4] |
20 |
ÐнаÑение, возвÑаÑÑнное меÑодом reduce() на ÑÑÐ¾Ñ Ñаз, конеÑно же, бÑÐ´ÐµÑ ÑавнÑм 20.
ÐÑимеÑÑ
>СÑммиÑование вÑÐµÑ Ð·Ð½Ð°Ñений в маÑÑиве
var total = [0, 1, 2, 3].reduce(function (a, b) {
return a + b;
});
// total == 6
СÑммиÑование знаÑений в маÑÑиве обÑекÑов
ЧÑÐ¾Ð±Ñ ÑÑммиÑоваÑÑ Ð·Ð½Ð°ÑениÑ, ÑодеÑжаÑиеÑÑ Ð² маÑÑиве обÑекÑов, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑказаÑÑ initialValue, ÑÑÐ¾Ð±Ñ ÐºÐ°Ð¶Ð´Ñй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñмог пÑойÑи ÑеÑез callback.
var initialValue = 0;
var sum = [{ x: 1 }, { x: 2 }, { x: 3 }].reduce(function (
accumulator,
currentValue,
) {
return accumulator + currentValue.x;
}, initialValue);
// sum == 6
Тоже Ñамое, но Ñо ÑÑÑелоÑной ÑÑнкÑией:
var initialValue = 0;
var sum = [{ x: 1 }, { x: 2 }, { x: 3 }].reduce(
(accumulator, currentValue) => accumulator + currentValue.x,
initialValue,
);
// sum == 6
РазвоÑаÑивание маÑÑива маÑÑивов
var flattened = [
[0, 1],
[2, 3],
[4, 5],
].reduce(function (a, b) {
return a.concat(b);
});
// flattened Ñавен [0, 1, 2, 3, 4, 5]
ÐÑимеÑ: Ñклеивание маÑÑивов, ÑодеÑжаÑÐ¸Ñ ÑÑ Ð² обÑекÑÐ°Ñ Ð¼Ð°ÑÑива, Ñ Ð¸ÑполÑзованием опеÑаÑоÑа ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¸ initialValue
// friends - ÑпиÑок из обÑекÑов(дÑÑзей)
// где поле "books" - ÑпиÑок лÑбимÑÑ
книг дÑÑга
var friends = [
{ name: "Anna", books: ["Bible", "Harry Potter"], age: 21 },
{ name: "Bob", books: ["War and peace", "Romeo and Juliet"], age: 26 },
{ name: "Alice", books: ["The Lord of the Rings", "The Shining"], age: 18 },
];
// allbooks - ÑпиÑок, коÑоÑÑй бÑÐ´ÐµÑ ÑодеÑжаÑÑ Ð²Ñе книги дÑÑзей +
// дополниÑелÑнÑй ÑпиÑок ÑказаннÑй в initialValue
var allbooks = friends.reduce(
function (prev, curr) {
return [...prev, ...curr.books];
},
["Alphabet"],
);
// allbooks = ["Alphabet", "Bible", "Harry Potter", "War and peace",
// "Romeo and Juliet", "The Lord of the Rings", "The Shining"]
ÐолиÑил
ÐеÑод Array.prototype.reduce() бÑл добавлен к ÑÑандаÑÑÑ ECMA-262 в 5-м издании; поÑÑÐ¾Ð¼Ñ Ð¾Ð½ Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑÑÑÑÑÑвоваÑÑ Ð² дÑÑгиÑ
ÑеализаÑиÑÑ
ÑÑандаÑÑа. ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑабоÑаÑÑ Ñ Ð½Ð¸Ð¼, добавив ÑледÑÑÑий код в наÑало ваÑиÑ
ÑкÑипÑов, он позволÑÐµÑ Ð¸ÑполÑзоваÑÑ reduce() в ÑеализаÑиÑÑ
, коÑоÑÑе не поддеÑживаÑÑ ÑÑÐ¾Ñ Ð¼ÐµÑод.
// Шаги алгоÑиÑма ECMA-262, 5-е издание, 15.4.4.21
// СÑÑлка (en): http://es5.github.io/#x15.4.4.21
// СÑÑлка (ru): http://es5.javascript.ru/x15.4.html#x15.4.4.21
if (!Array.prototype.reduce) {
Array.prototype.reduce = function (callback /*, initialValue*/) {
"use strict";
if (this == null) {
throw new TypeError("Array.prototype.reduce called on null or undefined");
}
if (typeof callback !== "function") {
throw new TypeError(callback + " is not a function");
}
var t = Object(this),
len = t.length >>> 0,
k = 0,
value;
if (arguments.length >= 2) {
value = arguments[1];
} else {
while (k < len && !(k in t)) {
k++;
}
if (k >= len) {
throw new TypeError("Reduce of empty array with no initial value");
}
value = t[k++];
}
for (; k < len; k++) {
if (k in t) {
value = callback(value, t[k], k, t);
}
}
return value;
};
}
СпеÑиÑикаÑии
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-array.prototype.reduce> |