在 JavaScript 编程中,数组是最常用的数据结构之一,而数组过滤则是处理数据集合的关键操作。filter() 方法提供了一种高效的方式来从数组中筛选出符合特定条件的元素,返回一个新的数组,而不改变原始数组。这种方法在处理对象数组时尤其有用,能够帮助开发者快速实现数据查询和筛选功能。

filter() 方法基础

语法和工作原理

filter() 方法接受一个测试函数作为参数,该函数会对数组中的每个元素进行测试。如果元素通过测试(即函数返回 true),则该元素会被包含在新数组中;否则被排除。

var newArray = arr.filter(callback(element[, index[, array]])[, thisArg])
  • callback: 测试函数,接收三个参数:
    • element: 当前处理的元素
    • index (可选): 当前元素的索引
    • array (可选): 调用 filter 的数组本身
  • thisArg (可选): 执行 callback 时使用的 this 值

基本数值数组过滤示例

// 定义一个包含数字的数组
var numbers = [5, 32, 43, 4];// 使用传统函数语法过滤奇数
var odd = numbers.filter(function(n) {return n % 2 !== 0; // 检查数字是否为奇数
});// 使用箭头函数简化语法
let odd = numbers.filter(n => n % 2 !== 0); 
// 可以进一步简化为: (n => n % 2),因为非零数字在布尔上下文中为 true// 结果: odd 包含 [5, 43]

对象数组的过滤

JavaScript 的 filter() 方法同样适用于对象数组,这使得它成为处理复杂数据集的强大工具。

基本对象过滤示例

// 定义人员对象数组
var people = [{id: 1,name: "John",age: 28
}, {id: 2,name: "Jane",age: 31
}, {id: 3,name: "Peter",age: 55
}];// 使用传统函数语法过滤年龄小于35岁的人
var young = people.filter(function(person) {return person.age < 35; // 年龄条件测试
});// 使用箭头函数简化语法
let young = people.filter(person => person.age < 35);// 结果: young 包含前两个对象
/*
[{id: 1,name: "John",age: 28
}, {id: 2,name: "Jane",age: 31
}]
*/

高级对象属性搜索

有时候我们需要在整个对象中搜索特定值,而不仅仅是某个特定属性:

// 搜索包含字母"J"的任何属性值
var young = people.filter((obj) => {var flag = false; // 标志变量,用于标记是否找到匹配Object.values(obj).forEach((val) => { // 遍历对象的所有值if(String(val).indexOf("J") > -1) { // 将值转换为字符串并检查是否包含"J"flag = true; // 找到匹配,设置标志return; // 提前退出循环}    });if(flag) return obj; // 如果找到匹配,返回当前对象
});// 结果: 返回包含"J"的对象
/*
[{id: 1,name: "John",age: 28
},{id: 2,name: "Jane",age: 31
}]
*/

filter() 方法的高级应用

多条件过滤

// 多条件过滤:年龄小于35且名字包含"J"
var filteredPeople = people.filter(person => {return person.age < 35 && person.name.includes("J");
});

链式调用多个数组方法

// 先过滤再映射提取特定属性
var names = people.filter(person => person.age < 35).map(person => person.name);// 结果: ["John", "Jane"]

性能考虑和最佳实践

  1. 避免在 filter 中修改原始数组:filter() 方法本身不会改变原数组,但回调函数中的操作可能会。
  2. 复杂操作提前终止:对于大型数组,如果可能,在找到所需元素后提前终止循环。
  3. 考虑使用索引:如果处理大型数组,可以使用回调函数的 index 参数进行性能优化。

filter() 与其他数组方法对比

flowchart TDA[原始数组] --> B[filter<br>条件筛选]A --> C[map<br>转换元素]A --> D[reduce<br>累积计算]B --> E[新数组:<br>符合条件的元素]C --> F[新数组:<br>转换后的元素]D --> G[单一结果:<br>累积值]

实际应用场景

场景一:电子商务产品过滤

const products = [{ id: 1, name: "笔记本电脑", price: 4500, category: "电子" },{ id: 2, name: "衬衫", price: 120, category: "服装" },{ id: 3, name: "智能手机", price: 2800, category: "电子" }
];// 过滤电子类产品且价格低于3000元的商品
const affordableElectronics = products.filter(product => product.category === "电子" && product.price < 3000
);// 结果: 智能手机

场景二:用户权限管理

const users = [{ id: 1, name: "管理员", role: "admin", active: true },{ id: 2, name: "编辑", role: "editor", active: true },{ id: 3, name: "访客", role: "guest", active: false }
];// 获取所有活跃的非管理员用户
const activeNonAdminUsers = users.filter(user => user.active && user.role !== "admin"
);

兼容性和替代方案

filter() 方法在 ECMAScript 5 (ES5) 中引入,所有现代浏览器都支持。对于需要支持老旧浏览器的项目,可以考虑使用 polyfill 或者类似的库函数(如 Lodash 的 _.filter)。

总结

JavaScript 的 filter() 方法是处理数组数据的强大工具,特别适合从大型数据集中提取符合特定条件的子集。通过掌握其基本用法和高级技巧,开发者可以编写出更简洁、高效和可维护的代码。无论是简单的数值数组还是复杂的对象数组,filter() 方法都能提供优雅的解决方案。


单词、短语表

单词(短语)音标词性词根/词缀释义搭配例子
Filtering/ˈfɪltərɪŋ/名词/动词filter(过滤) + -ing(动名词后缀)过滤data filtering, filtering methodData filtering is essential for processing large datasets.
Arrays/əˈreɪz/名词array(数组) + -s(复数)数组JavaScript arrays, multidimensional arraysJavaScript arrays can hold multiple values in a single variable.
Entity/ˈentəti/名词来自拉丁语 ens(存在)实体, 存在物business entity, legal entityEach database table represents an entity in the system.
Framework/ˈfreɪmwɜːrk/名词frame(框架) + work(工作)框架development framework, .NET frameworkEntity Framework is a popular ORM framework for .NET.
Extensions/ɪkˈstenʃənz/名词extend(扩展) + -sion(名词后缀) + -s(复数)扩展, 扩展功能browser extensions, framework extensionsThese extensions enhance the functionality of the base framework.
Bulk/bʌlk/名词/形容词来自古北欧语 bulki(货物)批量, 大量bulk operations, bulk dataBulk operations improve performance when handling large datasets.
Merge/mɜːrdʒ/动词来自拉丁语 mergere(浸入)合并, 融合merge conflicts, data mergeThe bulk merge operation combines insert and update operations.
Contains/kənˈteɪnz/动词con-(一起) + tain(持有) + -s(第三人称单数)包含, 含有array contains, contains methodThe new array contains only the elements that passed the test.
.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/98970.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98970.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/98970.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《sklearn机器学习——数据预处理》离散化

sklearn 数据预处理中的离散化&#xff08;Discretization&#xff09; 离散化是将连续型数值特征转换为离散区间&#xff08;分箱/bins&#xff09;的过程&#xff0c;常用于简化模型、增强鲁棒性、处理非线性关系或满足某些算法对离散输入的要求&#xff08;如朴素贝叶斯、决…

PTA算法简析

ArkAnalyzer源码初步分析I&#xff1a;https://blog.csdn.net/2302_80118884/article/details/151627341?spm1001.2014.3001.5501 首先&#xff0c;我们必须明确 PTA 的核心工作&#xff1a;它不再关心变量的“声明类型”&#xff0c;而是为程序中的每一个变量和每一个对象字段…

Vue 3 中监听多个数据变化的几种方法

1. 使用 watch监听多个 ref/reactive 数据import { ref, watch } from vueexport default {setup() {const count ref(0)const name ref()const user reactive({ age: 20 })// 监听多个数据源watch([count, name, () > user.age], // 数组形式传入多个数据源([newCount, …

第 2 篇:Java 入门实战(JDK8 版)—— 编写第一个 Java 程序,理解基础运行逻辑

用 IntelliJ IDEA 写第一个 Java 8 程序&#xff1a;Hello World 实操指南 作为 Java 初学者&#xff0c;“Hello World” 是你接触这门语言的第一个里程碑。本文会聚焦 Java 8&#xff08;经典 LTS 版本&#xff0c;企业级开发常用&#xff09; 和 IntelliJ IDEA&#xff08;当…

【GPT入门】第67课 多模态模型实践: 本地部署文生视频模型和图片推理模型

【GPT入门】第67课 多模态模型实践&#xff1a; 本地部署文生视频模型和图片推理模型1. 文生视频模型CogVideoX-5b 本地部署1.1 模型介绍1.2 环境安装1.3 模型下载1.4 测试2.ollama部署图片推理模型 llama3.2-vision2.1 模型介绍2.2 安装ollama2.3 下载模型2.4 测试模型2.5 测试…

C++初阶(6)类和对象(下)

1. 再谈构造函数&#xff08;构造函数的2个深入使用技巧&#xff09; 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 虽然上述构造函数调用之后&#xff0c;对象中已经有了一个初始值&#xff0c;…

容器文件描述符热迁移在云服务器高可用架构的实施标准

在云计算环境中&#xff0c;容器文件描述符热迁移技术正成为保障业务连续性的关键解决方案。本文将深入解析该技术在云服务器高可用架构中的实施标准&#xff0c;涵盖技术原理、实现路径、性能优化等核心维度&#xff0c;为构建稳定可靠的容器化基础设施提供系统化指导。 容器文…

毫米波雷达液位计如何远程监控水位?

引言毫米波雷达液位计作为一种高精度、非接触式的水位监测设备&#xff0c;正逐渐成为智慧水务、环境监测等领域的关键工具。其通过先进的调频连续波&#xff08;FMCW&#xff09;技术&#xff0c;实现5mm的测量精度&#xff0c;并支持多种远程通信方式&#xff0c;使用户能够实…

关于 C++ 编程语言常见问题及技术要点的说明

关于 C 编程语言常见问题及技术要点的说明C 作为一门兼具高效性与灵活性的静态编译型编程语言&#xff0c;自 1985 年正式发布以来&#xff0c;始终在系统开发、游戏引擎、嵌入式设备、高性能计算等领域占据核心地位。随着 C 标准&#xff08;如 C11、C17、C20&#xff09;的持…

【Qt QSS样式设置】

Qt中的QSS样式设置流程 Qt Style Sheets (QSS) 是Qt框架中用于自定义控件外观的样式表语言&#xff0c;其语法类似于CSS。以下是QSS的设置流程和示例。 QSS设置流程 1. 创建QSS样式表文件或字符串 首先&#xff0c;需要创建QSS样式表&#xff0c;可以是一个单独的.qss文件&…

使用 Apollo TransformWrapper 生成相机到各坐标系的变换矩阵

使用 Apollo TransformWrapper 生成相机到各坐标系的变换矩阵一、背景二、原理1、什么是变换矩阵&#xff1f;2、为什么需要变换矩阵&#xff1f;3、Apollo 中的坐标系4、Apollo TransformWrapper三、操作步骤1. 设置车辆参数2. 启动静态变换发布3. 查看变换信息4. 播放记录数据…

硬件(十)IMX6ULL 中断与时钟配置

一、OCP 原则&#xff08;开闭原则&#xff09;对代码扩展是开放的&#xff0c;允许通过新增代码来扩展功能&#xff1b;对代码的修改是关闭的&#xff0c;尽量避免直接修改已有稳定运行的代码&#xff0c;以此保障代码的稳定性与可维护性。二、中断处理&#xff08;一&#xf…

打工人日报#20250913

打工人日报#20250913 周六&#xff0c;回杭州了&#xff0c;这边居然下雨。 阅读 《小米创业思考》 第七章 技术为本 其中的技术介绍算是比较详细的&#xff0c;架构也很清晰&#xff0c;有一种对自己家产品如数家珍的感觉&#xff0c;对于架构也是经常思考的感觉感恩 和namwei…

【面试题】RAG核心痛点

1. 文档切分粒度不好把控&#xff0c;既担心噪声太多又担心语义信息丢失 这是一个经典难题。切分粒度过大&#xff0c;单个chunk包含过多无关信息&#xff08;噪声&#xff09;&#xff0c;会干扰LLM理解核心内容&#xff1b;切分过小&#xff0c;则可能割裂句子或段落的完整语…

网络安全与iptables防火墙配置

iptables基本概念iptables是Linux系统中强大的防火墙工具&#xff0c;它工作在用户空间&#xff0c;通过命令行界面与内核空间的netfilter框架交互&#xff0c;实现数据包过滤、网络地址转换(NAT)等功能。Web服务器防火墙配置实例以下是针对Web服务器的iptables配置步骤&#x…

qt中给QListWidget添加上下文菜单(快捷菜单)

步骤 添加customContextMenuRequested信号的槽函数&#xff0c;添加后&#xff0c;在QListWidget上单击右键&#xff0c;无法响应&#xff0c;还必须执行下面操作&#xff1b;设置QListWidget上下文菜单策略为Qt::CustomContextMenu 如下&#xff1a;

一款好看的jQuery前端框架-HisUI

HisUI&#xff1a;一款基于EasyUI的前端组件类库&#xff0c;让web开发更迅速、简单。 HisUI官网文档

【Docker】P3 入门指南:运维与开发双重视角

目录Docker入门&#xff1a;运维与开发运维视角Docker 架构概述Docker 镜像镜像概念理解查看和管理镜像拉取镜像镜像标识容器管理启动容器容器内操作容器的后台运行多容器管理重新进入运行中的容器容器生命周期管理开发视角容器化思维示例&#xff1a;基于 Nginx 镜像构建简单 …

第六届大数据、人工智能与物联网工程国际会议(ICBAIE 2025)

重要信息 时间&#xff1a;2025年10月17-19日 地点&#xff1a;中国上海 官网&#xff1a;www.icbaie.net 征稿主题 1. 大数据与云计算 2. 人工智能技术与应用 3. 机器人科学与工程 4. 物联网与传感器技术 5. 其他 大数据、人工智能与物联网 引言 在数字化转型的时代…

Docker存储卷(Volume)核心概念、类型与操作指南

文章目录一、存储卷概念二、存储卷分类2.1 管理卷2.2 绑定数据卷2.3 临时数据卷三、MySQL灾难恢复四、存储卷的局限性一、存储卷概念 什么是存储卷&#xff1f;   Docker 存储卷 是 Docker 容器中用于持久化存储数据的独立文件系统区域。它独立于容器的联合文件系统&#xf…