用法: 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。 语法:arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue]) 参数: callback:执行数组中每个值 (如果没有提供 initialValue则第一个值除外)的函数,包含四个参数 accumulator:累计器累计回调的返回值; 它是上一次调用回调时返回的累积值,或initialValue(见于下方)。 currentValue:数组中正在处理的元素。 index 可选:数组中正在处理的当前元素的索引。 如果提供了initialValue,则起始索引号为0,否则从索引1起始。 array可选:调用reduce()的数组 initialValue可选:作为第一次调用 callback函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。 返回值:函数累计处理的结果 reducer 函数接收4个参数:
- Accumulator (acc) (累计器)
- Current Value (cur) (当前值)
- Current Index (idx) (当前索引)
- Source Array (src) (源数组)
const myTest = [1, 2, 3, 4];
console.log('-----reduce------')
let result = myTest.reduce((arr,cur,idx,src)=>{
console.log(arr,cur,idx,src);
return arr+cur;
},0)
console.log('带initialValue为0的参数:'+result)
let result2 = myTest.reduce((arr,cur,idx,src)=>{
console.log(arr,cur,idx,src);
return arr+cur;
})
console.log('不带initialValue参数:'+result)
Array.prototype.myReduce = function(fun,initialValue){
if(typeof fun !=='function'){
throw new Error(fun + '不是一个函数')
}
if (!Object.Array(this)) {
throw new Error(`this 不是数组`)
}
// initialValue 有初始值时 accumulator为initialValue从0开始循环赋值;
// initialValue 无初始值时 arr[0]为initialValue 从1开始循环
let inVal = initialValue||this[0];
let i = initialValue?0:1;
for (i = 0; i < this.length; i++) {
inVal = fun(accumulator,this[i],i,this)
}
return inVal;
}
console.log('-----myReduce------')
let myResult = myTest.reduce((arr,cur,idx,src)=>{
console.log(arr,cur,idx,src);
return arr+cur;
},10)
console.log('带initialValue为10的参数:'+myResult)
let myResult2 = myTest.reduce((arr,cur,idx,src)=>{
console.log(arr,cur,idx,src);
return arr+cur;
})
console.log('不带initialValue参数:'+myResult2)