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