arr.reduce(callback(accumulator, currentValue, index, array), initialValue);
如果没有initialValue,默认数组的第一项为initialValue,第一次的currentValue为数组的第二项:
//没有提供initialValue function foo(){ return [1,2,3,4,5].reduce((x, y) => x + y); //15 };
reduce方法有两个参数,第一个参数是操作数组项的函数;第二个参数则是传入的初始值,reduce最常用的方法是叠加,以下例子可以看出,reduce函数根据初始值0,不断的叠加数组项:
var items = [10, 120, 1000]; // sumSoFar第一次初始值是1,item第一次初始值是数组的第一个元素即10; var total = items.reduce(function add(sumSoFar, item) { // 1 10 // 11 120 // 131 1000 console.log(sumSoFar, item); return sumSoFar + item; // 这个值会变成下一次的sumSoFar }, 1); console.log(total); // 1131
reduce函数的返回结果类型和传入的初始值相同,上个例子中初始值为number类型,初始值也可为object类型:
var items = [10, 120, 1000]; // sumSoFar第一次即初始值{sum: 0},item第一次为数组的第一个元素 var total = items.reduce(function (sumSoFar, item){ // {sum: 0} 10 // {sum: 10} 120 // {sum: 130} 1000 console.log(sumSoFar, item); sumSoFar.sum = sumSoFar.sum + item; // 对sumSoFar对象的值sum进行处理,累加数组里的每一项 return sumSoFar; // 返回处理后的sumSoFar对象 }, {sum: 0}); console.log(total); // {sum:1130}
var arr = [1,2,3,4,5,6,7,3,4,5,2,2,2]; // p第一次为初始值{},k第一次为数组的第一个元素,之后每次迭代p为为处理后(p[k]++ || (p[k] = 1))的p var info = arr.reduce(function(p,k){ p[k]++ || (p[k] = 1); return p; }, {}); console.log(info); // {1: 1, 2: 4, 3: 2, 4: 2, 5: 2, 6: 1, 7: 1}