JavaScript数组filter方法详解与应用

7 次阅读

JavaScript数组是前端开发中最常使用的数据结构之一,随着业务复杂度提升,对数组中的数据进行筛选、过滤成为非常常见的需求。例如,从商品列表中筛选符合条件的商品、从用户集合中查找有效用户、过滤空值数据等,都需要高效的数据筛选方法。JavaScript提供的filter()方法正是用于解决这类问题的核心数组方法之一。

filter()方法语法简单、可读性强,并且符合函数式编程思想,是现代JavaScript开发中非常重要的工具。掌握数组filter()方法的使用方式、执行机制以及常见应用场景,可以显著提升代码质量和开发效率。

JavaScript filter方法基本介绍

filter()是JavaScript数组对象提供的一个高阶函数,用于创建一个新数组,该数组包含通过指定条件测试的所有元素。

简单来说:

  • 遍历原数组中的每一个元素;

  • 对每个元素执行回调函数;

  • 如果回调函数返回true,当前元素会被保留;

  • 如果返回false,当前元素会被过滤掉;

  • 最终返回一个新的数组。

基本语法:

JavaScript
array.filter(function(currentValue, index, arr) {
    return condition;
});

参数说明:

参数说明
currentValue当前正在处理的数组元素
index当前元素的索引,可选
arr当前操作的原数组,可选

返回值:

filter()始终返回一个新数组,不会修改原始数组。

例如:

JavaScript
const numbers = [1, 2, 3, 4, 5, 6];

const result = numbers.filter(item => item > 3);

console.log(result);

输出:

JavaScript
[4, 5, 6]

原数组保持不变:

JavaScript
console.log(numbers);

结果:

JavaScript
[1, 2, 3, 4, 5, 6]

filter方法执行原理

理解filter()的执行过程,有助于正确使用它。

例如:

JavaScript
const ages = [12, 18, 25, 8, 30];

const adults = ages.filter(age => age >= 18);

执行过程如下:

第一次:

JavaScript
age = 12
12 >= 18 // false

元素被丢弃。

第二次:

JavaScript
age = 18
18 >= 18 // true

元素加入新数组。

最终:

JavaScript
[18, 25, 30]

可以理解为:

JavaScript
let result = [];

for(let i = 0; i < ages.length; i++){
    if(ages[i] >= 18){
        result.push(ages[i]);
    }
}

filter()本质上就是对这种循环逻辑进行了封装,使代码更加简洁。

filter与普通for循环的区别

传统循环方式:

JavaScript
const list = [10, 20, 30, 40];

let result = [];

for(let i = 0; i < list.length; i++){
    if(list[i] > 20){
        result.push(list[i]);
    }
}

console.log(result);

使用filter():

JavaScript
const result = list.filter(item => item > 20);

console.log(result);

两者结果一致。

相比传统循环,filter()具有以下优势:

1. 代码更加简洁

过滤逻辑直接写在回调函数中,减少临时变量。

2. 可读性更高

代码表达的是“获取满足条件的数据”,而不是描述具体循环过程。

3. 更符合函数式编程思想

可以与map()、reduce()等数组方法组合使用。

不过,在处理大量数据时,普通循环可能拥有更好的性能表现,因为filter()需要创建新的数组并执行函数调用。

filter方法常见应用场景

过滤数组中的数字

这是最基础的使用方式。

JavaScript
const numbers = [5, 10, 15, 20, 25];

const result = numbers.filter(num => num % 10 === 0);

console.log(result);

输出:

JavaScript
[10, 20]

过滤对象数组

实际开发中,数组通常存储对象数据。

例如:

JavaScript
const users = [
    {
        name: "Tom",
        age: 18
    },
    {
        name: "Jack",
        age: 15
    },
    {
        name: "Lucy",
        age: 22
    }
];

const adults = users.filter(user => user.age >= 18);

console.log(adults);

结果:

JavaScript
[
    {
        name:"Tom",
        age:18
    },
    {
        name:"Lucy",
        age:22
    }
]

这种方式经常用于:

  • 用户列表筛选;

  • 商品列表过滤;

  • 订单状态筛选;

  • 权限数据过滤。

根据条件动态过滤数据

项目中经常需要多个条件组合。

例如:

JavaScript
const products = [
    {
        name:"手机",
        price:3000,
        stock:true
    },
    {
        name:"电脑",
        price:8000,
        stock:false
    },
    {
        name:"耳机",
        price:500,
        stock:true
    }
];


const result = products.filter(product => {
    return product.price < 5000 && product.stock;
});

console.log(result);

返回:

JavaScript
[
 {
  name:"手机",
  price:3000,
  stock:true
 }
]

去除数组中的空值

处理接口数据时,经常需要清理无效数据。

例如:

JavaScript
const data = [
    "JavaScript",
    "",
    null,
    undefined,
    "Vue"
];

const result = data.filter(item => item);

console.log(result);

输出:

JavaScript
[
 "JavaScript",
 "Vue"
]

因为JavaScript中的以下值会被判断为false:

  • false

  • 0

  • ""

  • null

  • undefined

  • NaN

使用filter实现数组去重

虽然filter()不是专门用于去重的方法,但可以结合indexOf()实现简单去重。

示例:

JavaScript
const arr = [1,2,3,2,4,1];

const result = arr.filter((item,index)=>{
    return arr.indexOf(item) === index;
});

console.log(result);

输出:

JavaScript
[1,2,3,4]

不过现代JavaScript中,更推荐使用Set:

JavaScript
const result = [...new Set(arr)];

性能和可读性更好。

filter与map组合使用

开发中经常需要先筛选,再转换数据。

例如:

获取年龄超过18岁的用户姓名:

JavaScript
const users = [
    {
        name:"Alice",
        age:20
    },
    {
        name:"Bob",
        age:16
    }
];


const names = users
    .filter(user => user.age >= 18)
    .map(user => user.name);


console.log(names);

输出:

JavaScript
["Alice"]

这种链式写法是现代JavaScript开发中的常见模式。

filter与find方法区别

很多开发者容易混淆filter()和find()。

主要区别如下:

方法返回结果用途
filter数组获取所有符合条件的数据
find单个元素获取第一个符合条件的数据

示例:

JavaScript
const users = [
    {id:1,name:"Tom"},
    {id:2,name:"Jack"},
    {id:3,name:"Lucy"}
];


const result1 = users.filter(user=>user.id>1);

const result2 = users.find(user=>user.id>1);

结果:

JavaScript
result1:

[
 {id:2,name:"Jack"},
 {id:3,name:"Lucy"}
]


result2:

{
 id:2,
 name:"Jack"
}

如果只需要一个结果,使用find()更加合适。

filter方法不会改变原数组

JavaScript数组方法可以分为两类:

修改原数组:

  • push()

  • pop()

  • splice()

  • sort()

不会修改原数组:

  • filter()

  • map()

  • slice()

  • concat()

例如:

JavaScript
const arr = [1,2,3,4];

const result = arr.filter(item=>item>2);

console.log(arr);

输出:

JavaScript
[1,2,3,4]

因此,在需要保持原始数据完整性的场景中,filter()非常安全。

filter使用注意事项

回调函数必须返回布尔值

正确:

JavaScript
const result = arr.filter(item=>{
    return item > 10;
});

错误:

JavaScript
const result = arr.filter(item=>{
    item > 10;
});

如果没有返回值,默认返回undefined,所有元素都会被过滤掉。

不建议在filter中修改数据

例如:

JavaScript
const result = users.filter(user=>{
    user.active = true;
    return user.age > 18;
});

虽然可以执行,但会产生副作用,降低代码可维护性。

更推荐:

JavaScript
const result = users
.filter(user=>user.age>18)
.map(user=>({
    ...user,
    active:true
}));

空数组调用filter

如果数组为空:

JavaScript
[].filter(item=>item);

返回:

JavaScript
[]

不会报错。

filter性能优化建议

对于普通业务数据,filter()性能完全可以满足需求。

但面对几十万甚至百万级数据时,需要注意:

避免重复过滤

不推荐:

JavaScript
list.filter(a).filter(b).filter(c);

可以合并条件:

JavaScript
list.filter(item=>{
    return a(item)&&b(item)&&c(item);
});

减少数组遍历次数。

提前结束需求不要使用filter

因为filter()会遍历整个数组。

例如:

查找第一个满足条件的数据:

JavaScript
array.find(item=>condition);

比:

JavaScript
array.filter(item=>condition)[0];

更加高效。

ES6箭头函数简化filter写法

传统写法:

JavaScript
const result = numbers.filter(function(item){
    return item > 5;
});

箭头函数:

JavaScript
const result = numbers.filter(item=>item>5);

如果逻辑复杂:

JavaScript
const result = numbers.filter(item=>{
    if(item>5){
        return true;
    }

    return false;
});

可以根据实际业务选择。

实际项目中的filter应用案例

商品搜索过滤

电商项目中,根据关键词筛选商品:

JavaScript
const keyword = "手机";

const result = products.filter(product=>{
    return product.name.includes(keyword);
});

权限菜单过滤

后台管理系统常见:

JavaScript
const menus = menusList.filter(menu=>{
    return user.permissions.includes(menu.permission);
});

删除无效接口数据

JavaScript
const validData = response.data.filter(item=>{
    return item.id && item.status;
});

总结

JavaScript数组filter()方法是一种高效、简洁的数据筛选工具,核心作用是根据条件返回符合要求的新数组。它不会修改原数组,适合处理列表过滤、数据清洗、权限控制、搜索筛选等大量前端业务场景。

掌握filter()不仅需要了解基本语法,还需要理解它与map()、find()等数组方法的区别,以及合理使用链式调用和性能优化技巧。在现代JavaScript、Vue、React等前端开发环境中,熟练使用数组filter()方法能够让代码更加清晰、高效,也能提升项目整体可维护性。