美文网首页
87.实现Array.prototype.filter

87.实现Array.prototype.filter

作者: wo不是黄蓉 | 来源:发表于2022-04-06 13:41 被阅读0次

Array.prototype.filter

callback必须是一个函数,接收三个参数并且返回一个布尔值。

如果提供了thisArg参数,它将用作每次调用callbackfn时的this值。如果没有提供,用Undefined代替。

执行filter方法的步骤:

image.png
  • 判断传入的回调不是一个函数,抛出异常
  • 创建一个存放结果的数组
  • 遍历数组中的每个元素
  • 如果有第二个参数,则将回调函数的this指向第二个参数,默认为undefined,即this为当前调用对象
  • 调用回调函数,将符合条件的结果进行返回
//1.实现filter方法
Array.prototype.filter1 = function (callback, thisArg) {
  if (Object.prototype.toString.call(callback) != "[object Function]")
    return new Error("参数不是一个函数");
  //存放结果
  let result = [];
  //拷贝this
  let array = Object.create(this);
  //thisArg如果有,会被作为callback被调用时的this值,否则this值在非严格模式下将是全局对象
  if (thisArg === undefined) {
    //callback(element[, index[, array]])[, thisArg]
    //为什么不用for循环而是用for...in?
    for (let i = 0; i < array.length; i++) {
      // callback(array[i], i, array);
      //怎么判断是结果集中的数据?调用callback,返回值是一个boolean类型的值
      if (callback(array[i], i, array)) {
        result.push(array[i]);
      }
    }
  } else {
    for (let i = 0; i < array.length; i++) {
      // callback(array[i], i, array);
      //怎么判断是结果集中的数据?调用callback,返回值是一个boolean类型的值
      if (callback.call(array[i], i, array)) {
        result.push(array[i]);
      }
    }
  }

  return result;
};

相关文章

网友评论

      本文标题:87.实现Array.prototype.filter

      本文链接:https://www.haomeiwen.com/subject/ewjrsrtx.html