reduce
归纳函数 返回一个新数组
[].reduce(function (prev, elem, index, arr) {}, initialValue);
第一个参数(回调函数)
回调函数中的第一个参数prev
表示上一次回调返回的值 第一次时为传入的第二个参数即initialValue
后三个参数
elem index arr
与forEach回调函数中的参数的使用方法一模一样
前文已经详细描述过着几个参数怎么使用了 推荐阅读 这里就略过了
第二个参数
initialValue
与其他遍历方法不同的是 这个参数是必填项
var arr = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }];
var initialValue = [];
arr.reduce(function (prev, elem, index, arr) {
console.log(prev, elem, index, arr);
}, initialValue);
prev 就是 initialValue
var arr = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }];
var initialValue = [];
arr.reduce(function (prev, elem, index, arr) {
console.log(prev === initialValue);
}, initialValue);
必须每次return prev 才会有值 不会返回undefined
var arr = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }];
var initialValue = [];
arr.reduce(function (prev, elem, index, arr) {
console.log(prev);
return prev;
}, initialValue);
每次遍历时都可以对prev进行处理
var arr = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }];
var initialValue = [];
var newArr = arr.reduce(function (prev, elem, index, arr) {
prev.push(elem.id);
console.log(prev);
return prev;
}, initialValue);
实现myReduce
Array.prototype.myReduce = function (fn, initialValue) {
var arr = this,
len = arr.length,
arg2 = arguments[2] || window;
for (var i = 0; i < len; i++) {
initialValue = fn(initialValue, arr[i], i, arr);
}
return initialValue;
};
reduceRight
var arr = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }];
var initialValue = [];
var newArr = arr.reduceRight(function (prev, elem, index, arr) {
prev.push(elem.id);
return prev;
}, initialValue);
实现myReduceRight
Array.prototype.myReduceRight = function (fn, initialValue) {
var arr = this,
len = arr.length;
for (var i = len - 1; i >= 0; i--) {
initialValue = fn(initialValue, arr[i], i, arr);
}
return initialValue;
};