数组reduce方法详解

140 阅读2分钟

数组reduce方法详解

语法

array.reduce(function(total, cur, index, arr), initialValue)

参数

total: 必需。初始值, 或者计算结束后的返回值。

cur: 必需。当前元素

index: 可选。当前元素的索引

arr: 可选。当前元素所属的数组对象。

注意:如果没有提供initialValue,reduce 会从索引1的地方开始执行 callback 方法,跳过第一个索引。如果提供initialValue,从索引0开始。

有无初始值举例

  • 没有设置初始值
let arr = [1, 2, 3, 4];
let sum = arr.reduce(function(prev, cur, index, arr) {
    console.log(prev, cur, index);
    return prev + cur;
})
console.log(arr, sum);

运行结果:

分析: 无初始值,索引从1开始。初始值为0的值。函数被调用了3次。

  • 有初始值
let arr = [1, 2, 3, 4];
let sum = arr.reduce(function(prev, cur, index, arr) {
    console.log(prev, cur, index);
    return prev + cur;
},0)
console.log(arr, sum);

运行结果:

分析:

​ 初始值为0,索引从0开始。函数被调用了4次。

应用

求和

[0, 1, 2, 3, 4].reduce((prev, curr) => prev + curr );

求积

[1, 2, 3, 4].reduce((prev, curr) => prev * curr );

计算数组中每个元素出现的次数

var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];

var countedNames = names.reduce(function (allNames, name) {
	allNames[name] ? allNames[name] ++ : allNames[name] = 1;
	return allNames;
}, {});
// countedNames is:
// { 'Alice': 2, 'Bob': 1, 'Tiff': 1, 'Bruce': 1 }

将二维数组转化成一维数组

var flattened = [[0, 1], [2, 3], [4, 5]].reduce(
  function(a, b) {
    return a.concat(b);
  },
  []
);
// flattened is [0, 1, 2, 3, 4, 5]

累加对象数组里的值

var initialValue = 0;
var sum = [{x: 1}, {x:2}, {x:3}].reduce(function (prev, cur) {
    return prev + cur.x;
},initialValue)

console.log(sum) // logs 6

要弄明白prevcur这2个参数的区别,刚开始我以为他们是一种类型的,可是后来我发现我理解错了。prev表示每次叠加之后的结果,类型可能与数组中的每一项不同,而cur则表示数组中参与叠加的当前项。根据上面的例子细细体会。