手写reduce方法

手写常用的数组方法是面试中的常考题目,同时学会这些API的原理也能更好的帮助我们去理解这些API并加运用,下面让我们来一起手写reduce吧~

原生reduce接收几个参数?

原生的reduce是在Array的原型对象上的一个方法,其接收两个参数:

  1. 一个回调函数。这个回调函数的前两个参数,分别表示累积值和当前值。
  2. 初始值。

实现原生reduce的思路

  1. 通过slice原型方法获取到调用reduce的数组。
  2. 定义一个临时结果变量和开始的索引。
  3. 如果传入了初始值,res就等于这个初始值,没有传入res就等于数组的第一项。
  4. 如果传入了初始值,起始索引就是0,没有传入起始所以就是1,这里的1代表的是数组的第二项。
  5. 从起始下标开始遍历,res = fn.call(null,res,arr[i])
Array.prototype.myReduce = function (fn, initialValue) {
    
    
    var arr = Array.prototype.slice.call(this);
    var res, startIndex;
    res = initialValue ? initialValue : arr[0]; // 不传默认取数组第一项
    startIndex = initialValue ? 0 : 1;
    for (var i = startIndex; i < arr.length; i++) {
    
    
        // 把初始值、当前值、索引、当前数组返回去。调用的时候传到函数参数中 [1,2,3,4].reduce((initVal,curr,index,arr))
        res = fn.call(null, res, arr[i]);
    }
    return res;
}

const test = [1,2,3];
console.log(test.myReduce((pre,cur) => pre + cur));

总结与思考

手写原生的reduce这个题目,需要用到原生的slice方法,需要用到call,需要知道this指向的是谁,同时我们要对是否传入初始者进行判断,如果传入初始值,起始索引和初始值都是从第一项开始的,如果没有传入res则表示数组的第一项,起始索引则从第二项开始。

猜你喜欢

转载自blog.csdn.net/sinat_41696687/article/details/124240727