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

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

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

定义

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"]

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

相关推荐

重生之我在头条学html网页编程,这一世我一定学好,成为编程高手

有人要问了html是什么东西?就是用来设计网页的一种语言会不会很难啊?这是很多朋友担心的,我告诉大家这是最简单最基础也最容易学习的一款入门级语言,当初我也是经常因为学不会C语言而苦恼自从学习了html...

如何在网页3D CAD中创建一个三维管道模型

前言在网页CAD中进行三维建模是一项有趣的任务。本文将介绍如何利用mxcad3d来创建三维管道模型。该工具提供了一系列三维建模功能的API,使得建立复杂的管道结构变得简单直观。安装在此之前,需要先安装...

网页模版如何用

网页模版已成为如今网站建设的核心工具。随着互联网需求的增长,越来越多的企业和组织需要建立自己的网站,以展示他们的品牌和服务。在这个过程中,网页模版为他们提供了一种简单而高效的方式来构建网站。所谓网页模...

AI嵌入式Flowcode编程网页开发人员入门指南

WebDeveloper允许使用FlowcodeIDE环境开发具有交互性的网页。可以在2D面板中添加特殊网页组件,以创建网页的视觉表示,并可以使用流程图添加交互功能。它的引入意味着Flowcod...

用Deepseek制作网页版的汉诺塔游戏保姆级教程

在deepseek中输入:“帮我做一个网页版的汉诺塔演示游戏,游戏包含2层、3层、4层、5层的汉诺塔游戏演示,制作自动求解演示按钮,点击按钮就可以生成出步数,同时自动演示最优解动画。”最后把生成的程序...

TaskBuilder前端页面CSS样式规则设置

在前端页面设计器内,点击底部的“CSS样式”选项卡,可以打开CSS样式设计器,在此查看和设计当前页面的CSS样式规则,如下图所示:3.3.6.1引入外部样式文件如果要在页面中引入外部CSS文件,可以点...

使用 Python、FastHTML 和 Uvicorn 构建简单的博客网站

FastHTML是2024年7月推出的PythonWeb框架,是一个简单但功能强大的框架,允许开发人员使用纯Python构建Web应用程序。(不需要复杂的模板引擎)。Fast...

用AI可以生成HTML网页了,很多初级前端都要失业了

即使你完全不懂html,javascript,css,也能做出漂亮的网页,这在以前是不可想象的,而现在确是可行的,因为有这样一个项目:openUI。openUI不仅仅能生成html页面,还能生成自适应...

python原始套接字socket下载http网页文件到txt

python原始套接字socket下载http网页文件到txtimportsocketdefdownload_webpage(url,output_file):try:...

高效排版:实现DeepSeek生成内容Word格式排版并导...

高效排版:实现DeepSeek生成内容Word格式排版并导出的经典方法,步骤简洁高效:DeepSeek生成内容复制出来容易出现乱码,下面介绍一种比较高效简单的方法!一、核心三步法1.调整模型模式在D...

打工人福音!3分钟教你学会word精美排版

昨天大熊介绍了word一键排版的三种办法,今天我们来详细讲讲第二种办法,用html代码实现一键排版,然后再导出pdf实现精美效果。打工人,打工魂,你是不是也有以下烦恼?下面是我经过多次和Deepsee...

使用 HTML 创建可折叠的交互式组件,一行 JS 代...

如果你想创建一个可折叠的交互式组件,使用<details>元素即可,一行JavaScript也不用写。<details>组件定义了一个可折叠的容器,它的第一个元素必须...

新手小白1分钟学会Word——文档的编辑1.1

天空一声巨响,迷人的我闪亮登场,亲爱的家人们,周末好呀!话不多说,咱们继续开干!昨天说到本节还有个小尾巴,那咱们就把这个小尾巴了结了,然后开始新篇章~四、保存文档我们对文档编辑完之后最重要的一步就...

超强!DeepSeek+HTML制作数据看板,老板看了都点赞

DeepSeek以极强的推理能力,支持生成各种代码,比如Python、SQL、Matlab、JS、HTML等,你可以拿这些代码放到编译器里,就能直接跑出结果,比如机器学习算法、exe应用、可视化图表、...

什么是Tailwind CSS

什么是TailwindCSSTailwindCSS是一个实用优先(Utility-First)的CSS框架,其核心思想是通过直接在HTML中组合预定义的类名来快速构建界面样式,无需编写传...