原生JavaScript进阶训练---重写filter方法

news/2024/7/19 12:49:50 标签: js, filter, 前端, es6

码字不易,有帮助的同学希望能关注一下我的微信公众号:Code程序人生,感谢!代码自用自取。

在这里插入图片描述

这期我们重写的是一个非常常用的数组扩展方法filter

按照惯例,我们先看一下原生filter的使用

  var arr = [
    {
      name: "张三",
      age: 34,
    },
    {
      name: "李四",
      age: 25,
    },
    {
      name: "王五",
      age: 21,
    },
    {
      name: "刘六",
      age: 28,
    },
  ];

  var obj = {
    name: "Jacky",
    age: 3,
  };

  var newArr = arr.filter(function (item, index, array) {
    console.log(this);
    return item.age > 25;
  }, obj);

  console.log(newArr);

filter和它的名字一样,我们可以知道,它除了遍历数组之外,可以实现筛选、过滤的作用。

在这里插入图片描述

通过控制台输出的结果我们可以发现,我们传入了filter的第二个参数obj后,回调函数里的this指向是传入的obj

通过return回来的新数组newArr,我们可以知道,在回调里的return里可以做判断,判断结果为true的才会被返回给newArr。

所以item.age > 25的只有张三和刘六。

好了,我们了解完原生的filter后,开始重写它。

  Array.prototype.myFilter = function (callBack) {
    var _arr = this;
    var _len = _arr.length;
    var _arg2 = arguments[1] || window;
    var _newArr = [];
    var _item;

    for (var i = 0; i < _len; i++) {
      _item = deepClone(_arr[i]);
      callBack.apply(_arg2, [_item, i, _arr]) ? _newArr.push(_item) : "";
    }

    return _newArr;
  };

和上期的map方法重写做比较,最大区别就是在apply的参数中,filter会进行一次三元表达式的比较,为true的才会被push给新数组,其它的操作都差不多。

还有就是如果大家不知道这个deepClone方法的作用和内容,看上期的博客即可。

下面我们来测试一下,自己重写的myFilter方法和原生的filter有没有区别。

  function deepClone(obj) {
    let newObj = obj.push ? [] : {}; //如果obj有push方法则 定义newObj为数组,否则为对象。
    for (let attr in obj) {
      if (typeof obj[attr] === "object") {
        newObj[attr] = deepClone(obj[attr]);
      } else {
        newObj[attr] = obj[attr];
      }
    }
    return newObj;
  }
  Array.prototype.myFilter = function (callBack) {
    var _arr = this;
    var _len = _arr.length;
    var _arg2 = arguments[1] || window;
    var _newArr = [];
    var _item;

    for (var i = 0; i < _len; i++) {
      _item = deepClone(_arr[i]);
      callBack.apply(_arg2, [_item, i, _arr]) ? _newArr.push(_item) : "";
    }

    return _newArr;
  };

  var arr = [
    {
      name: "张三",
      age: 34,
    },
    {
      name: "李四",
      age: 25,
    },
    {
      name: "王五",
      age: 21,
    },
    {
      name: "刘六",
      age: 28,
    },
  ];

  var obj = {
    name: "Jacky",
    age: 3,
  };

  var newArr = arr.filter(function (item, index, array) {
    console.log(this);
    return item.age > 25;
  }, obj);

  console.log(newArr);

  console.log('------');

  var newArr2 = arr.myFilter(function (item, index, array) {
      console.log(this);
      return item.age > 25;
  }, obj);

  console.log(newArr2);

在这里插入图片描述

通过控制台的输出,我们可以发现,myFilter方法和filter方法没有任何的区别,包括回调里的this指向。


有微信小程序课设、毕设需求联系个人QQ:505417246

关注下面微信公众号,可以领取微信小程序、Vue、TypeScript、前端、uni-app、全栈、Nodejs、Python等实战学习资料
最新最全的前端知识总结和项目源码都会第一时间发布到微信公众号,请大家多多关注,谢谢

在这里插入图片描述


http://www.niftyadmin.cn/n/1576494.html

相关文章

【网络】 应用传输层笔记

应用层 应用层常用的协议和各自对应的TCP/UDP端口&#xff1a; DNS  TCP/UDP  53 HTTP  TCP  80 SMTP  TCP  25 POP  UDP  110 Telnet  TCP  23 DHCP  UDP  67 FTP  TCP  20和21 关于端口号的分配可以提一下&#xff1a; 公认端口&#xff1a;0-10…

前端数据结构与算法复习日记---前言

码字不易&#xff0c;有帮助的同学希望能关注一下我的微信公众号&#xff1a;Code程序人生&#xff0c;感谢&#xff01;代码自用自取。 数据结构与算法一直是程序员的命脉&#xff0c;对于后端程序员来说&#xff0c;它是必须要熟练的。对于前端程序员&#xff0c;在一些中小型…

前端数据结构与算法复习日记---直接插入排序

码字不易&#xff0c;有帮助的同学希望能关注一下我的微信公众号&#xff1a;Code程序人生&#xff0c;感谢&#xff01;代码自用自取。 直接插入排序是插入类排序算法里比较简单的一个了。 它的核心思路就是&#xff1a; 首先默认数组的第一项元素是最小的&#xff08;升序&…

[linux]Linux入门

Linux操作系统文件系统基础知识详解(转载) blog.chinaunix.net/uid-26449305-id-3023428.html 三大经典 不可不知的Linux发行版本介绍&#xff08;转载&#xff09; blog.chinaunix.net/uid-26449305-id-3027547.html Linux 20 周年庆祝会 51CTO 会场 http://os.51cto.com/exp…

jQuery-过滤选择器一

1、基本过滤选择器 <script type"text/javascript">$(function(){$(div:first).css(background,red); //所有div元素中的第一个div元素$(div:last).css(background,blue); //所有div元素中的最后一个div元素$(div:not(.one)).css(background,green); //所…

原生JavaScript进阶训练---重写call方法

码字不易&#xff0c;有帮助的同学希望能关注一下我的微信公众号&#xff1a;Code程序人生&#xff0c;感谢&#xff01;代码自用自取。 之前的系列中&#xff0c;跟着大家重写了数组常用的一些内置方法&#xff0c;今天给大家重写一下call方法&#xff0c;这个也是面试非常非常…

串口的AT命令

1.设置 DCD 功能模式 DCD 线路只在数据载波存在时打开(当建立GRPRS连接时&#xff0c;DCD输出低电平) AT&C1 2.设置 DTR 功能模式 DTR 由 ON 至 OFF&#xff08;电平从低到高&#xff09;&#xff1a; TA 在保持当前数据通话的同时&#xff0c;切换至命令模式。 AT&D1 …

聊聊什么是CommonJs和Es Module及它们的区别

码字不易&#xff0c;有帮助的同学希望能关注一下我的微信公众号&#xff1a;Code程序人生&#xff0c;感谢&#xff01;代码自用自取。 前言 初衷&#xff1a;将我整理的笔记分享给大家&#xff0c;希望本篇文章能给你带来不一样的认知&#xff0c;不喜勿喷。 适合人群&#…