JavaScript中Array实例方法filter的实现原理

 更新时间:2024年03月24日 10:10:21   作者:Aimilali  
filter() 方法创建一个新数组,其中包含通过所提供函数实现的测试的所有元素,本文将给大家介绍JavaScript中Array实例方法filter的实现原理,文中通过代码示例讲解的非常详细,需要的朋友可以参考下

Array.prototype.filter()

filter() 方法创建一个新数组,其中包含通过所提供函数实现的测试的所有元素。 换句话说,它会筛选出原始数组中满足条件的元素,并将其组成一个新的数组返回。 filter() 不会改变原数组,但是传入的回调函数可以改变原数组。

语法

filter(callbackFn) 
filter(callbackFn, thisArg)

参数

1、callbackFn:为数组中的每个元素执行的函数。返回的真值会将元素追加到新数组中(是追加不是添加),否则返回一个假值。

该函数被调用时将传入以下参数:

  • element:数组中当前正在处理的元素。
  • index:正在处理的元素在数组中的索引。
  • array:调用了 filter() 的数组本身。

2、thisArg(可选):执行 callbackFn 时用作 this 的值。

返回值

返回给定数组的一部分的浅拷贝,其中只包括通过提供的函数实现的测试的元素。 如果没有元素通过测试,则返回一个空数组。

用法

第一种(推荐)

const array = [1, 2, 3]
const newArray = array.filter((element, index, array) => {
    // 返回真假值判断
    return Object.is(element, 2)
})
// [2]

第二种(基于 this 进行操作时)

const thisArg = { value: 1 }
const array = [1, 2, 3]
const newArray = array.filter(function (element, index, array) {
    // 返回真假值判断
    return Object.is(element, this.value)
}, thisArg)
// [1]

描述

filter() 方法是一个迭代方法。它为数组中的每个元素调用提供的 callbackFn 函数一次,并构造一个由所有返回真值的元素值组成的新数组。

callbackFn 仅在已分配值的数组索引处被调用。它不会在稀疏数组中的空槽处被调用。

请注意,在第一次调用 callbackFn之前,数组的长度已经被保存。因此:

  • 当开始调用 filter() 时,callbackFn 将不会访问超出数组初始长度的任何元素。
  • 对已访问索引的更改不会导致再次在这些元素上调用 callbackFn。
  • 如果数组中一个现有的、尚未访问的元素被 callbackFn 更改,则它传递给 callbackFn 的值将是该元素被修改后的值。被删除的元素则不会被访问

上述类型的并发修改经常导致难以理解的代码,通常应避免(特殊情况除外)。

filter() 方法是通用的。它只期望 this 值具有 length 属性和整数键属性。

实现 filter 方法

从上面 filter 描述总结实现 filter 时注意实现这三点。

  • 回调函数调用之前,数组的长度已经被保存。
  • 回调函数不会在稀疏数组中的空槽处被调用。
  • 返回值是所有真值的元素值组成的新数组。
Array.prototype.myFilter = function (fun, context) {
    if (!Object.is(typeof fun, 'function')) {
        throw TypeError(`${typeof fun} is not a function`)
    }
    const length = this.length // 数组的长度已经被保存
    const newArr = []
    for (let i = 0; i < length; i++) {
        if (Object.hasOwn(this, i)) {  // 跳过稀疏数组
            const result = fun.call(context, this[i], i, this)
            if (result) {
                newArr.push(this[i]) // 追加符合过滤条件的元素
            }
        }
    }
    return newArr
}

结语

到此这篇关于JavaScript中Array实例方法filter的实现原理的文章就介绍到这了,更多相关JavaScript Array filter实现内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 8个JavaScript条件语句优化小技巧分享

    8个JavaScript条件语句优化小技巧分享

    在日常的开发中,我们经常会编写一些条件语句,过多的 if...else会导致代码难以理解和维护,今天小编来分享几个优化条件语句的小技巧,希望对大家有所帮助
    2022-07-07
  • uniapp项目打包为桌面应用的方法步骤

    uniapp项目打包为桌面应用的方法步骤

    本文主要介绍了uniapp项目打包为桌面应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-08-08
  • JavaScript实现的原生态Tab标签页功能【兼容IE6】

    JavaScript实现的原生态Tab标签页功能【兼容IE6】

    这篇文章主要介绍了JavaScript实现的原生态Tab标签页功能,可兼容IE6及谷歌等浏览器,涉及javascript事件响应及页面元素动态操作相关实现技巧,需要的朋友可以参考下
    2017-09-09
  • 微信小程序使用Echarts和分包的完整步骤

    微信小程序使用Echarts和分包的完整步骤

    这篇文章主要给大家介绍了关于微信小程序使用Echarts和分包的完整步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • JavaScript使用setTimeout实现延迟弹出警告框的方法

    JavaScript使用setTimeout实现延迟弹出警告框的方法

    这篇文章主要介绍了JavaScript使用setTimeout实现延迟弹出警告框的方法,实例分析了javascript中setTimeout函数的使用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • 通过js实现压缩图片上传功能

    通过js实现压缩图片上传功能

    这篇文章主要介绍了通过js实现压缩图片上传功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 深入理解JS addLoadEvent函数

    深入理解JS addLoadEvent函数

    下面小编就为大家带来一篇深入理解JS addLoadEvent函数。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • 微信小程序请求前置的方法详解

    微信小程序请求前置的方法详解

    这篇文章主要给大家介绍了关于微信小程序请求前置的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 微信小程序海报绘制示例讲解

    微信小程序海报绘制示例讲解

    这篇文章主要介绍了微信小程序海报绘制示例,海报分享功能在许多应用中应该是很常见的,因为它作为一种常用的应用推广和拉新的方式,下面我们来通过案例学习如何绘制
    2024-05-05
  • 深入浅出webpack之externals的使用

    深入浅出webpack之externals的使用

    这篇文章主要介绍了深入浅出webpack之externals的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12

最新评论