手写reduce方法

516 阅读1分钟
    //实现reduce 方法 reduce对数组中的每个元素执行reduce中的回调函数,然后每次记录累加结果在第一个参数中,最终返回
    // [1,2,4].reduce((pre,cur,idx,array)=>{},initVal)   pre也是累加器。 一些边缘情况没考虑。比如 对于空数组的reduce,reduce会抛出错误!
    Array.prototype.mockReduce =function(f,initVal){
      // 对this暂时存储,方便下面语义化处理逻辑。
      const array =this;

      // 先处理initVal和没有initVal的情况,其实就是
      let pre = initVal || array[0];
      // 再处理将要进行的for循环从哪个开始坐标开始 ,如果有初始值,数组中的第一位还没有被循环到,所以startIdx要从0开始,也把他带上
      // 如果没有则,pre已经是数组的第一位了。
      const startIdx = initVal ? 0 :1;
      for(let i = startIdx; i < array.length;i++){
          const cur = array[i];
          //执行内置函数,并将累加器参数记录下来。赋值给第一个参数,让其一直记录累加下去。
          pre =f(pre,cur,i,array);
      }
      // 这第一参数也是累加器,也是返回的内容 (可能是任意的数据类型)
      return pre;

    }
    console.log([1,2,3].mockReduce((pre,cur) =>pre+cur,0));