Array.prototype.filter() 是 JavaScript 数组的一个高阶函数,用于筛选数组中满足条件的元素,返回一个新数组。
1. 基本语法
const newArray = array.filter(callback(element, index, array), thisArg)
| 参数 | 说明 |
|---|---|
element |
当前处理的数组元素 |
index |
当前元素的索引(可选) |
array |
原数组(可选) |
thisArg |
执行回调时的 this 值(可选) |
返回值:包含所有通过测试的元素的新数组
2. 核心特性
(1) 不改变原数组
const numbers = [1, 2, 3, 4, 5];
const evenNumbers = numbers.filter(n => n % 2 === 0);
console.log(numbers); // [1, 2, 3, 4, 5](原数组不变)
console.log(evenNumbers); // [2, 4](新数组)
(2) 回调函数返回布尔值
// 返回 true:保留该元素
// 返回 false:过滤掉该元素
const result = [1, 2, 3].filter(n => n > 1); // [2, 3]
(3) 自动跳过空位
const sparseArray = [1, , 3]; // 有空位
const result = sparseArray.filter(n => true);
console.log(result); // [1, 3](空位被跳过)
3. 简单示例
基础用法
const numbers = [1, 2, 3, 4, 5, 6];
// 筛选偶数
const evens = numbers.filter(num => num % 2 === 0);
console.log(evens); // [2, 4, 6]
// 筛选大于3的数
const largeNumbers = numbers.filter(num => num > 3);
console.log(largeNumbers); // [4, 5, 6]
字符串数组过滤
const fruits = ['apple', 'banana', 'grape', 'orange'];
// 筛选包含字母 'a' 的水果
const aFruits = fruits.filter(fruit => fruit.includes('a'));
console.log(aFruits); // ['apple', 'banana', 'grape', 'orange']
// 筛选长度大于5的水果
const longFruits = fruits.filter(fruit => fruit.length > 5);
console.log(longFruits); // ['banana', 'orange']
4. 实用场景示例
(1) 对象数组过滤
const users = [
{ name: 'Alice', age: 25, active: true },
{ name: 'Bob', age: 30, active: false },
{ name: 'Carol', age: 28, active: true }
];
// 筛选活跃用户
const activeUsers = users.filter(user => user.active);
console.log(activeUsers);
// [{ name: 'Alice', age: 25, active: true }, { name: 'Carol', age: 28, active: true }]
// 筛选年龄大于27的用户
const olderUsers = users.filter(user => user.age > 27);
console.log(olderUsers);
// [{ name: 'Bob', age: 30, active: false }, { name: 'Carol', age: 28, active: true }]
(2) 删除特定值
// 删除所有假值(false, 0, "", null, undefined, NaN)
const mixedArray = [0, 1, false, 2, '', 3, null, undefined, NaN];
const truthyValues = mixedArray.filter(Boolean);
console.log(truthyValues); // [1, 2, 3]
// 删除空字符串和 null
const cleanArray = ['hello', '', 'world', null, 'js'].filter(item => item);
console.log(cleanArray); // ['hello', 'world', 'js']
(3) 搜索过滤
const products = [
{ name: 'iPhone', category: 'electronics', price: 999 },
{ name: 'MacBook', category: 'electronics', price: 1999 },
{ name: 'Novel', category: 'books', price: 20 }
];
// 根据搜索条件过滤
const searchTerm = 'phone';
const searchResults = products.filter(product =>
product.name.toLowerCase().includes(searchTerm.toLowerCase())
);
console.log(searchResults); // [{ name: 'iPhone', ... }]
// 多条件过滤
const expensiveElectronics = products.filter(product =>
product.category === 'electronics' && product.price > 1000
);
console.log(expensiveElectronics); // [{ name: 'MacBook', ... }]
5. Vue 中的使用示例
<template>
<div>
<input v-model="searchText" placeholder="搜索用户">
<ul>
<li v-for="user in filteredUsers" :key="user.id">
{{ user.name }} - {{ user.email }}
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
searchText: '',
users: [
{ id: 1, name: 'Alice', email: 'alice@example.com' },
{ id: 2, name: 'Bob', email: 'bob@test.com' },
{ id: 3, name: 'Carol', email: 'carol@example.com' }
]
};
},
computed: {
filteredUsers() {
return this.users.filter(user =>
user.name.toLowerCase().includes(this.searchText.toLowerCase()) ||
user.email.toLowerCase().includes(this.searchText.toLowerCase())
);
}
}
};
</script>
6. 注意事项
(1) 性能考虑
// ❌ 避免在循环中嵌套 filter
const bigArray = [/* 大量数据 */];
const result = bigArray.filter(item => {
// 复杂的计算...
});
// ✅ 考虑先用 map 预处理
const preprocessed = bigArray.map(item => transform(item));
const result = preprocessed.filter(item => condition(item));
(2) 稀疏数组处理
const sparse = [1, , 3, , 5];
const result = sparse.filter(x => true);
console.log(result); // [1, 3, 5](空位被移除)
(3) 与 find() 的区别
const numbers = [1, 2, 3, 4];
// filter:返回所有匹配元素
const evens = numbers.filter(n => n % 2 === 0); // [2, 4]
// find:返回第一个匹配元素
const firstEven = numbers.find(n => n % 2 === 0); // 2
7. 浏览器兼容性
- 支持所有现代浏览器(IE9+)
- Polyfill:如需支持旧浏览器,可引入 core-js
总结
- 用途:从数组中筛选满足条件的元素
- 返回值:新数组(原数组不变)
- 核心:回调函数返回
true-留下元素,false-删除该元素 ★★★ - Vue 应用:常用于计算属性实现动态过滤
- 优势:函数式编程,代码简洁易读
.filter() 是处理数组筛选需求的首选方法,比传统 for 循环更简洁安全!
记忆口诀
true 留,false 走
条件成立就保留,不成立就踢掉
这个简单的规则是 .filter()方法的核心机制,掌握了它就掌握了数组过滤的精髓!
