前端面试题 - 117. 实现数组的reduce\filter\map\every方法

244 阅读1分钟

比较简单,都是for循环上加上特别的处理。

// filter 方法实现
Array.prototype.myFilter = function(callback) {
  const filteredArray = [];

  // 遍历数组元素
  for (let i = 0; i < this.length; i++) {
    // 根据回调函数的返回值进行过滤
    if (callback(this[i], i, this)) {
      filteredArray.push(this[i]); // 符合条件的元素加入结果数组
    }
  }

  return filteredArray; // 返回过滤后的新数组
};

// map 方法实现
Array.prototype.myMap = function(callback) {
  const mappedArray = [];

  // 遍历数组元素
  for (let i = 0; i < this.length; i++) {
    // 对每个元素进行映射操作,并将结果加入新数组
    mappedArray.push(callback(this[i], i, this));
  }

  return mappedArray; // 返回映射后的新数组
};

// reduce 方法实现
Array.prototype.myReduce = function(callback, initialValue) {
  let accumulator = initialValue === undefined ? this[0] : initialValue;

  // 根据初始值是否存在决定起始位置
  for (let i = initialValue === undefined ? 1 : 0; i < this.length; i++) {
    accumulator = callback(accumulator, this[i], i, this); // 将累加器和当前元素传递给回调函数
  }

  return accumulator; // 返回最终的累计结果
};

// every 方法实现
Array.prototype.myEvery = function(callback) {
  // 遍历数组元素
  for (let i = 0; i < this.length; i++) {
    // 如果有任何元素不满足条件,则返回 false
    if (!callback(this[i], i, this)) {
      return false;
    }
  }

  return true; // 所有元素都满足条件,返回 true
};