reduce() 方法对数组中的每个元素执行一个由您提供的 reducer 函数(升序执行),将其结果汇总为单个返回值。reducer 函数接收 4 个参数:
- Accumulator (acc) (累计器)
- Current Value (cur) (当前值)
- Current Index (idx) (当前索引)
- Source Array (src) (源数组)
您的 reducer 函数的返回值分配给累计器,该返回值在数组的每个迭代中被记住,并最后成为最终的单个结果值。
Scenario 数组求和
let arr = [];
for (let i = 1; i < 101; i++) {
arr.push(i);
}
let sum = arr.reduce(
(ack, currentValue, index, sourceArr) => ack + currentValue,
0
);
console.log(sum);
// 5050
Scenario 对象的属性求和
let objArr = [{x: 1}, {x:2}, {x:3}]
let sum = objArr.reduce((ack, currentValue) =>
(return ack + currentValue.x)
, 0)
console.log(sum) // logs 6
Scenario 统计数组中单个元素出现的次数
var names = ["Alice", "Bob", "Tiff", "Bruce", "Alice"];
var objs = names.reduce((ack, currentValue) => {
if (currentValue in ack) {
ack[currentValue]++;
} else {
ack[currentValue] = 1;
}
return ack;
}, {});
console.log(objs);
Scenario 数组去重
let myArray = ["a", "b", "a", "b", "c", "e", "e", "c", "d", "d", "d", "d"];
//let myArray = [1,2,1,2,3,5,4,5,3,4,4,4,4];
let finArray = myArray.sort().reduce((ack, currentValue) => {
if (ack.indexOf(currentValue) === -1) {
ack.push(currentValue);
}
return ack;
}, []);
console.log(finArray);