面试官:请你简单实现一下数组方法reduce

97 阅读2分钟

现如今的前端面试中,常常会考察候选人的编码能力。不仅会考察基本的数据结构与算法,还会考察javascript基本功,看候选人对js基础的理解和掌握程度。

面试官:请你简单实现一下数组方法reduce

要想实现一个东西,必须要懂这个东西是做什么用的。

reduce方法接收两个参数,第一个参数是一个回调函数,第二个参数是一个初始值。回调函数接收四个参数,分别为上一次调用回调函数后的返回值、当前处理的数组项、当前数组项的下标以及数组本身,分别对应下方的prev、curr、index和array。 reduce方法的第二个参数初始值不是必需参数,若传了初始值则prev值为传的初始值,若未传初始值则prev值为数组的第一项。

let arr = [1, 2, 3];
let res = arr.reduce((prev, curr, index, array) => {
  return prev + curr; 
})

// res = 6

懂了reduce是什么了之后,我们就可以用代码实现他啦~

第一步:把reduce方法挂载到Array构造函数的原型上来进行模拟

Array.prototype.myReduce = function () {
}

第二步:判断传的第一个参数是否为函数,若不是则抛出一个错误

Array.prototype.myReduce = function (fn, initValue) {
  if (typeof fn !== 'function') {
      throw new Error('parameter1 is not a function')
  } 
}

第三步:判断是否传了初始值并对数组进行遍历处理,最后返回结果。

这里我们定义了一个i,若传了初始值则数组遍历时我们从数组第一项开始遍历,若没传则从数组第二项开始遍历,因为数组第一项的值就是初始值。

Array.prototype.myReduce = function (fn, initValue) {
  if (typeof fn !== 'function') {
    throw new Error('parameter1 is not a function')
  }

  let i = 0;

  if (typeof(initValue) === "undefined") {
    i = 1;
    initValue = this[0];
  }
  
  for (; i < this.length; i++) {
    initValue = fn(initValue, this[i], i, this);
  }

  return initValue;
}
仅需10行左右代码就完成coding考察了~~~~~~~~: