手写reduce
大约 2 分钟
MDN参考
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
语法
reduce(callbackFn)
reduce(callbackFn, initialValue)
参数
为数组中每个元素执行的函数。其返回值将作为下一次调用
callbackFn
时的accumulator
参数。对于最后一次调用,返回值将作为reduce()
的返回值。该函数被调用时将传入以下参数:accumulator
上一次调用callbackFn
的结果。在第一次调用时,如果指定了initialValue
则为指定的值,否则为array[0]
的值。currentValue
当前元素的值。在第一次调用时,如果指定了initialValue
,则为array[0]
的值,否则为array[1]
。currentIndex
currentValue
在数组中的索引位置。在第一次调用时,如果指定了initialValue
则为0
,否则为1
。array
调用了reduce()
的数组本身。initialValue
可选第一次调用回调时初始化
accumulator
的值。如果指定了initialValue
,则callbackFn
从数组中的第一个值作为currentValue
开始执行。如果没有指定initialValue
,则accumulator
初始化为数组中的第一个值,并且callbackFn
从数组中的第二个值作为currentValue
开始执行。在这种情况下,如果数组为空(没有第一个值可以作为accumulator
返回),则会抛出错误。
返回值
使用“reducer”回调函数遍历整个数组后的结果。
异常
如果数组为空且未提供
initialValue
,则会抛出异常。
手写实现
/**
* 手写reduce
* @param {*} callbackFn
* @param {*} initialValue
* @returns
*/
Array.prototype.myReduce = function(callbackFn, initialValue){
let hasInitialValue = initialValue !== undefined;
// 初始化
// const [fn,...args] = [...arguments]
const arr_ = this
const length = arr_.length
if(length === 0){
if(hasInitialValue){
return initialValue
}else {
throw TypeError("Reduce of empty array with initial value");
}
}
let accumulator = hasInitialValue ? initialValue : this[0];
let i = hasInitialValue ? 0 : 1;
for(i;i<length;i++){
accumulator = callbackFn(accumulator,arr_[i],arr_)
}
return accumulator;
}
const a = new Array(1,2,3)
console.log(a.myReduce((a,b) => {return a+b})) // 6