Reduce

Reduce

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);