Array.prototype.reduce()
Array.prototype.reduce() #
reduce()
方法接收一个函数作为累加器,从左到右依次遍历数组中的每个值,最终计算为一个值。
语法 #
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
1
参数 #
callback
: 数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,包含四个参数:accumulator
: 累计器累计回调的返回值,它是上一次调用回调时返回的累积值,或initialValue
currentValue
: 正在处理的当前元素index
(可选): 正在处理的当前元素的索引。如果提供了initialValue
,则起始索引号为0
,否则从索引1
起始array
(可选): 调用reduce()
的数组
initialValue
(可选): 作为第一次调用callback
函数时的第一个参数的值。如果没有提供初始值,则将使用数组中的第一个元素。在没有初始值的空数组上调用reduce
将报错
返回值 #
函数累计处理的结果。
示例 #
const arr = [0, 1, 2, 3];
const sum = arr.reduce(function (accumulator, currentValue) {
return accumulator + currentValue;
}, 0);
const sum2 = arr.reduce(function (accumulator, currentValue) {
return accumulator + currentValue;
}, 10);
console.log(sum); // 6
console.log(sum2); // 16
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
手写实现 #
Array.prototype.myReduce = function reduce(callback, initialValue) {
// 首先判断传入的第一个参数是否为函数, 如果不是则抛出错误
if (Object.prototype.toString.call(callback) !== '[object Function]') {
throw '第一个参数必须是一个函数';
}
const array = this; // 拿到当前数组
const index = initialValue === undefined ? 1 : 0; // 如果存在初始值,索引从 1 开始,否则从 0 开始
let accumulator = initialValue || array[0]; // 拿到初始值
// 遍历, 调用传入的函数, 并将返回值保存在 result 中,注意这里将 this 指向改为 thisArg
for (let i = index; i < array.length; i++) {
accumulator = callback(accumulator, array[i], i, array);
}
return accumulator;
};
const arr = [0, 1, 2, 3];
const sum = arr.reduce(function (accumulator, currentValue) {
return accumulator + currentValue;
}, 0);
const sum2 = arr.reduce(function (accumulator, currentValue) {
return accumulator + currentValue;
}, 10);
console.log(sum); // 6
console.log(sum2); // 16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
编辑 (opens new window)
上次更新: 2021-06-23 08:43:55