Baseline Widely available
ÐеÑод 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;
};
}
СпеÑиÑикаÑии СовмеÑÑимоÑÑÑ Ñ Ð±ÑаÑзеÑами СмоÑÑиÑе Ñакже
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4