百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

js中数组filter方法的使用和实现_js实现数组的indexof方法

yund56 2025-02-25 00:34 29 浏览

定义

filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。

语法

var newArray = arr.filter(callback(element[, index[, selfArr]])[, thisArg])

参数

callback
循环数组每个元素时调用的回调函数。回调函数返回 true 表示保留该元素,false 则不保留。它接受以下三个参数:
(1)element
数组中当前正在处理的元素。
(2)index可选
正在处理的元素在数组中的索引。
(3)selfArr可选
调用了 filter 方法的数组本身。

thisArg可选
执行 callback 时,用于 改变callback函数this 的值。

返回值

一个新的、由调用callback函数返回值为true的元素组成的数组,如果callback函数调用米没有返回true,则返回空数组。

详细描述

filter 方法循环数组中的每个元素时调用一次 callback 函数,并利用所有使得 callback 回调函数返回 true 或等价于 true 的值的元素创建一个新数组。注意:callback 回调函数只会在已经赋值的索引上被调用,对于那些已经被删除或者从未被赋值的索引不会被调用。那些没有通过 callback 测试的元素会被跳过,不会被包含在新数组中。

callback 回调函数被调用时传入三个参数:
1.数组当前元素的值
2.元素在数组中的索引
3.被遍历的数组本身

如果为 filter 提供一个 thisArg 参数,则它会被作为 callback 被调用时的 this 值。否则,callback 的 this 值在非严格模式下将是全局对象,严格模式下为 undefined。(callback 函数最后的this指向根据this指向规则进行确定)
filter 不会改变原数组,它返回过滤后的新数组。(虽然filter 方法本身不会改变原数组,但是我们可以在callback函数中进行改变)。

filter 遍历的元素范围在第一次调用 callback 之前就已经确定了。在调用 filter 之后被添加到数组中的元素不会被 filter 遍历到。如果已经存在的元素被改变了,则他们传入 callback 的值是 filter 遍历到它们那一刻的值。被删除或从来未被赋值的元素不会被遍历到。

使用示例

    let arr = [1,3, ,7]
    const newArray = arr.filter((element, index, selfArr) => {
        console.log(index, this)
        return element > 3
    }, {a: 9})
    console.log(newArray)
    // 0 Window 
    // 1 Window 
    // 3 Window 
    // [7]

上述代码结果返回一个新的数组newArray 里面包含所有大于3的原数组arr中的元素,再执行中传入callback回调函数为箭头函数,并传递了改变callback函数this指向的参数thisArg,由打印结果可以看出当callback函数为箭头函数时,thisArg参数没有作用,并且再循环的过程中,原数组中的空值也不会调用传入的callback函数。下面我们看下传入普通函数时的使用:

    let arr1 = ['a', 'ab', 'c']
    const newArry1 = arr1.filter(function(element, index, selfArr){
        console.log(index, this)
        selfArr.push('ac')
        return element.length > 1
    },{a:9})
    console.log(newArry1)
    console.log(arr1)
    // 0 {a: 9}
    // 1 {a: 9}
    // 2 {a: 9}
    // ["ab"]
    // (6) ["a", "ab", "c", "ac", "ac", "ac"]

上述代码过滤的结果返回一个新的数组newArray1里面包含原数组arr1中所有length大于1 的元素。在执行的过程中传入的callback函数为普通函数,根据打印结果可以看出,当callback为普通函数的时候,它的this就会指向传入的thisArg参数,并且在执行callback函数的时候虽然改变了原数组arr1,但是filter方法并不会去遍历新增加的元素。除了传入自定义的函数外我们还可以传入js一些原生的方法如:

    let arr2 = [1,0,null,undefined,'','1']
    const newArray2 = arr2.filter(Boolean)
    console.log(newArray2)
    //  [1, "1"]

上述代码过滤的结果返回一个新的数组newArray2里面包含了原数组中所有经过转换后为true的元素。经过上面的描述和使用接下来就模拟实现自己的filter方法

步骤思路

1、将模拟实现的方法挂在到数组的原型上
2、传入callback参数和thisArg参数
3、创建一个新数组并获取调用该方法原数组的长度(利用this指向规则)
4、利用hasOwnProperty 方法过滤删除的值和空值
5、利用call方法调用callback函数并改变它的指向为thisArg参数
6、根据callback函数返回是否为true,将当前循环的元素添加到数组
7、返回新数组

实现代码

    Array.prototype.myFilter = function(callback, thisArg) {
        // 获取数组的长度,确定循环的次数
        const length = this.length
        let newArray = []
        for (let index = 0; index < length; index++) {
            // 利用hasOwnProperty方法过滤原数组空值和已经删除的值
            if (this.hasOwnProperty(index)) {
                // 利用call方法改变callback函数this的指向
                if (callback.call(thisArg, this[index], index, this)) newArray.push(this[index])
            }
        }
        return newArray
    }

测试验证

Array.prototype.myFilter = function(callback, thisArg) {
        // 获取数组的长度,确定循环的次数
        const length = this.length
        let newArray = []
        for (let index = 0; index < length; index++) {
            // 利用hasOwnProperty方法过滤原数组空值和已经删除的值
            if (this.hasOwnProperty(index)) {
                // 利用call方法改变callback函数this的指向
                if (callback.call(thisArg, this[index], index, this)) newArray.push(this[index])
            }
        }
        return newArray
    }

    let arr = [1,3, ,7]
    const newArray = arr.myFilter((element, index, selfArr) => {
        console.log(index, this)
        return element > 3
    }, {a: 9})
    console.log(newArray)
    // 0 Window 
    // 1 Window 
    // 3 Window 
    // [7]

    let arr1 = ['a', 'ab', 'c']
    const newArry1 = arr1.myFilter(function(element, index, selfArr){
        console.log(index, this)
        selfArr.push('ac')
        return element.length > 1
    },{a:9})
    console.log(newArry1)
    console.log(arr1)
    // 0 {a: 9}
    // 1 {a: 9}
    // 2 {a: 9}
    // ["ab"]
    // (6) ["a", "ab", "c", "ac", "ac", "ac"]

    let arr2 = [1,0,null,undefined,'','1']
    const newArray2 = arr2.myFilter(Boolean)
    console.log(newArray2)
    //  [1, "1"]

由打印结果可以看出结果和原方法一致。

相关推荐

分享|最美色彩!40张纯迷彩高清原图壁纸送给你

最美的色彩是什么?对于军人来说是迷彩那是青春的本色是理想、使命的颜色40张纯迷彩高清原图壁纸送给你so快来收图!!军报记者微信发布作者:剑客小吉;编辑:王旭;编审:曲延涛;投稿邮箱:jfjbwx@16...

你还在用百度搜图?推荐5个图片素材库,你要的图片都有!

自媒体运营人每天都需要进行内容创作,所以少不了图片、视频、文案素材等,那么这些自媒体素材哪里找呢?今天,就给大家分享5个图片和视频素材库,文案素材下期再给大家详细介绍。图片和视频素材现在已经是做短视频...

《2》图片原创无版权素材

粉樱于雨中轻轻摇曳,花瓣飘呀飘的,落在小径上、湖面上,将世界晕染成柔和的粉色。雨滴似银线,串联起天空与湖水,古亭在一旁静静凝望,连空气都透着甜意。我们一直在寻觅“诗意”的模样,原来就是这般——有落花纷...

太美了!100个令人窒息的绝美风景摄影照

全网最全的图片素材网站分享!任意下载!值得收藏!

自媒体时代,很多内容创作者都需要高清的图片资源。因为图片不清晰会带来不好的用户体验~众所周知,从网上下载的图片一般都是有版权的!如果你直接下载使用,可能会有侵权的风险!今天为了帮助大家解决图片问题,今...

中秋节素材(海报+插画)!绝景良时难再并

部分预览随机选取中秋节素材(海报+插画)(仅供会员下载)...

10张早上好美图,早安祝福语和祝福图片选集

每天准时分享接收:早安问候图片、漂亮的早安图片、问候祝福语、动态聊天表情包等等每日的祝福准时送达,愿你用满满的正能量开启新的一天。美满,是日常的点点汇聚;情谊,是时光的悠悠长卷;一声招呼,穿越五湖四海...

晚安心语正能量经典素材带图片,让你一见倾心

一、没事的,每个人大概都会经历一些情绪崩溃或者极端的时刻,会好的,会熬过来的。二、以后,只对两种人好,一种是对我好的人,一种是懂得我的好的人,一个人的温暖也是有限的啊,一点都不能浪费。三、要钱,就要努...

太厉害了,52种科幻画主题创意素材,极其脑洞大开,科技创新未来

图片来自网络,仅作分享,如有侵权请联系删除哦...

综合绘画素材—29张冬天主题绘画素材,一起来画你心中的冬天呀

图片来自,仅作分享,如有侵权请联系删除哦...

20张彩色线描装饰画素材!一起欣赏线条带来的艺术美呀!

图片来自网络,仅作分享,如有侵权请联系删除哦...

国外的免费素材网站!这3个大神私藏款,你还没用过?

做PPT没素材?去网上找了半天,浪费时间不说,大部分还收费,等于白忙活!不少小伙伴也问我有没有免费好用的素材网站,这不就来了。今天和大家分享3个国外的素材网站,关键是免费又高质量。不管是PPT设计还是...

8个高清无版权的图片资源网站,质量高又免费,够你用一辈子

很多时候我们找素材总是要花费很多时间,今天就给大家分享8个,高清无版权的图片资源网站,质量高又免费,够你用一辈子。01*Logosc链接:https://www.logosc.cn/so/这是一个免版...

100种超萌手帐素材简笔画,小白看一遍也能学会

手帐素材集中营:天气、美食、植物花草、动物、人物、乐器都在这里。一次画个够,转存轻松做手帐~爱画画,爱生活~...

超治愈萌系手帐素材大全 美食旅游花草人物花边都备齐了

现代人每天都生活在一个充满焦灼感的空气中,成年人的世界里,每个人都不容易。不论是生活还是工作,都充满了各种挫折。很少有人能一帆风顺,为学习、为工作、为家庭、为感情、我们总会在坎坎坷坷中成长,难免会觉得...