filter是javascript数组方法,创建新数组保留满足回调函数条件的元素;不修改原数组,回调需返回布尔值,常用于数值筛选、对象属性过滤及多条件匹配,注意处理null/undefined。

filter 是 JavaScript 数组的内置方法,用于创建一个新数组,其中包含所有通过指定条件(回调函数)的元素。它不会修改原数组,而是返回符合条件的元素组成的新数组。
基本用法:传入一个回调函数
回调函数接收三个参数:当前元素、索引、原数组。通常只用第一个参数(当前元素)即可。
- 回调函数必须返回布尔值(true 表示保留该元素,false 表示过滤掉)
- filter 不会跳过空位(如稀疏数组中的 empty slot),但会遍历所有已定义的索引
- 如果数组为空,直接返回空数组
[]
示例:
const numbers = [1, 2, 3, 4, 5];const evens = numbers.filter(n => n % 2 === 0); // [2, 4]
过滤对象数组:按属性筛选
常见需求是根据对象某个字段做判断,比如筛选状态为 "active" 的用户。
- 在回调中访问对象属性,返回布尔表达式
- 注意避免访问 undefined 属性导致报错,可加可选链或默认值
示例:
const users = [{ id: 1, name: 'Alice', active: true },
{ id: 2, name: 'Bob', active: false },
{ id: 3, name: 'Charlie', active: true }
];
const activeUsers = users.filter(u => u.active); // 保留 active 为 true 的对象
结合 includes、indexOf 或正则做模糊/多条件过滤
实际开发中常需更灵活的匹配逻辑,比如关键词搜索、多值匹配等。
- 用
includes()判断字符串是否含某子串 - 用
some()配合数组判断是否满足任一条件 - 正则配合
test()实现模式匹配
示例(名字含 "a" 且年龄大于 18):
const people = [{ name: 'Anna', age: 25 },
{ name: 'Ben', age: 17 },
{ name: 'Cara', age: 30 }
];
const result = people.filter(p => p.name.toLowerCase().includes('a') && p.age > 18); // [{ name: 'Anna', age: 25 }, { name: 'Cara', age: 30 }]
注意点:filter 不会改变原数组,也不会处理 null/undefined 元素本身
如果数组里有 null 或 undefined,它们会被正常传入回调;你需要在回调里主动判断,否则可能报错。
- 错误写法:
arr.filter(item => item.name.includes('x'))—— 若 item 是 null 就报错 - 安全写法:
arr.filter(item => item && item.name && item.name.includes('x')) - 也可用可选链:
arr.filter(item => item?.name?.includes('x'))(ES2020+)











