reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
注意: reduce() 对于空数组是不会执行回调函数的。
reduce()
arr.reduce(callback, initialValue)
reduce会为数组中的每个元素执行回调函数,回调函数(callback)有四个参数,分别为
prev: 上一次执行完返回的值(包括初始值)
item: 当前的元素(当前执行回调函数的元素)
index: 当前元素位置(下标index值)
arr: 原数组(执行的当前数组)
initialValue: 可选,第一次执行回调函数的初始值(也就是第一次执行回调函数时, prev的初始值,可以给他赋值为一个[], {}或者一个数字)
例子
数字求和
let arr = [1, 2, 3, 4, 5];
let sum = arr.reduce((prev, item) => {
console.log(prev, item);
return prev + item;
});
console.log(sum);
添加一个初始值
let arr = [1, 2, 3, 4, 5];
let sum = arr.reduce((prev, item) => {
console.log(prev, item);
return prev + item;
} 10); // 这里设置了初始值
console.log(sum);
如果没有添加初始值,第一次回调从数组的index为1的地方开始执行,而添加初始值后第一次回调从数组的index为0的地方开始执行
有时候不设置初始值会报错
let arr = [1, 2, 3, 4, 5];
let Arr = arr.reduce((prev, item) => {
console.log(prev, item);
prev.push(item);
return prev;
});
console.log(Arr);
添加初始值后
let arr = [1, 2, 3, 4, 5];
let Arr = arr.reduce((prev, item) => {
console.log(prev, item);
prev.push(item);
return prev;
}, []); // 设置初始值后
console.log(Arr);
使用的时候最好给一个初始值,否则有时候报错
reduce() 功能
1. 数字求和(上面已介绍)
2. 数字阶乘
let arr = [1, 2, 3, 4, 5];
let sum = arr.reduce((prev, item) => {
console.log(prev, item);
return prev * item;
}, 1);
console.log(sum);
3. 数组去重
let Arr = [1, 3, 2, 2, 4, 5]
let arr = Arr.reduce((prev, item) => {
if (!prev.includes(item)){
prev.push(item);
}
return prev;
}, []);
console.log(arr);
4. 计算数组中每个元素出现的个数
let Arr = [1, 3, 2, 2, 4, 5];
let arr = Arr.reduce((prev, item) => {
if (item in prev) {
prev[item]++;
} else {
prev[item] = 1;
}
return prev;
}, {});
console.log(arr);
5. 除去数组中的嵌套数组
let Arr = [[2, 5, 9], [0, 3]];
let arr = Arr.reduce((prev, item) => {
// 使用concat() 或者[...]将两个数组合并
// let as = prev.concat(item);
let as = [...prev, ...item];
return as;
}, []);
console.log(arr);