官方文档解释:
定义:
Array.prototype.reduce()
reduce()
方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。
参数:
callback
执行数组中每个值 (如果没有提供 initialValue则第一个值除外
)的函数,包含四个参数: accumulator
:累计器累计回调的返回值; 它是上一次调用回调时返回的累积值,或initialValue
(见于下方)。
currentValue
:数组中正在处理的元素
index
可选:数组中正在处理的当前元素的索引。 如果提供了initialValue
,则起始索引号为0,否则从索引1起始。
array
可选:调用reduce()
的数组
initialValue
可选
作为第一次调用 callback
函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。
值得注意的是:回调函数第一次执行时,accumulator
和currentValue
的取值有两种情况:如果调用reduce()
时提供了initialValue
,accumulator
取值为initialValue
,currentValue
取数组中的第一个值;如果没有提供 initialValue
,那么accumulator
取数组中的第一个值,currentValue
取数组中的第二个值
<script>
// Array.prototype.myReduce(),效果等同于Array.prototype.reduce()
//将其结果汇总为单个返回
var arr = [1,2,3,4,5,6,6,7,8,9,10];
var result1 = arr.reduce(function(prev,current,index,arr) {
console.log("++++++++",prev)
return prev+current
},10);
var result3 = arr.reduce(function(prev,current,index,arr) {
console.log(",,,,,,,,",prev)
return prev+current
});
console.log(result1);
console.log(result3);
console.log("-----------------------------------------");
// Array.prototype.myReduce = function(callback,initialValue) {
// if(initialValue !== undefined) {//存在
// for(var i = 0; i < this.length; i++) {
// num = callback(initialValue,this[i],i,this);
// initialValue = num;
// };
// return initialValue;
// }else {
// initialValue = this[0];
// // console.log("initialValue[0]",initialValue);
// for(var j = 1;j < this.length; j++) {
// num = callback(initialValue,this[j],j,this);
// initialValue = num;
// // console.log("num",num);
// // console.log("initialValue",initialValue);
// }
// return initialValue;
// }
// }
//优化后
Array.prototype.myReduce = function(callback,prev) {
//判断遍历开始时候的下标
//存在就是循环以0开始,不存在循环就以1(下标)开始
var initialValue = prev === undefined?1:0;
prev = prev === undefined?this[0]:prev;
for(var i = initialValue;i < this.length;i++) {
prev = callback(prev,this[i],i,this);
}
return prev;
}
var result2 = arr.myReduce(function(prev,current,index,arr) {
console.log("-------"+prev)
return prev+current
},10)
var result4 = arr.myReduce(function(prev,current,index,arr) {
console.log("=======",prev)
return prev+current
})
console.log(result2);
console.log(result4);
</script>