JavaScript中filter() 和find()的区别对比小结

 更新时间:2025年05月08日 10:28:23   作者:胡歌1  
filter() 和 find() 都是 JavaScript 数组的高阶函数,用于搜索数组元素,本文主要介绍了JavaScript中filter() 和find()的区别对比,感兴趣的可以了解一下

filter() 和 find() 都是 JavaScript 数组的高阶函数,用于搜索数组元素,但它们有几个关键区别:

1. 基本区别

特性filter()find()
返回值新数组(包含所有匹配元素)第一个匹配的元素(不是数组)
空结果返回空数组 []返回 undefined
用途筛选多个符合条件的元素查找第一个符合条件的元素

2. 代码示例对比

示例数组

const users = [
  { id: 1, name: 'Alice', active: true },
  { id: 2, name: 'Bob', active: false },
  { id: 3, name: 'Charlie', active: true },
  { id: 4, name: 'David', active: true }
];

使用 filter()

// 找出所有活跃用户
const activeUsers = users.filter(user => user.active);
console.log(activeUsers);
// 输出: [
//   {id: 1, name: 'Alice', active: true},
//   {id: 3, name: 'Charlie', active: true},
//   {id: 4, name: 'David', active: true}
// ]

// 没有匹配项时
const noUsers = users.filter(user => user.age > 100);
console.log(noUsers); // 输出: []

使用 find()

// 查找第一个活跃用户
const firstActive = users.find(user => user.active);
console.log(firstActive);
// 输出: {id: 1, name: 'Alice', active: true}

// 没有匹配项时
const notFound = users.find(user => user.age > 100);
console.log(notFound); // 输出: undefined

3. 性能考虑

  • filter() 会遍历整个数组,即使已经找到所有符合条件的元素

  • find() 在找到第一个匹配项后立即停止遍历

// 性能测试
const bigArray = Array(1000000).fill(0).map((_, i) => i);

console.time('filter');
bigArray.filter(x => x === 500000); // 会检查所有元素
console.timeEnd('filter'); // 输出: filter: 5.22509765625 ms

console.time('find');
bigArray.find(x => x === 500000); // 找到后立即停止
console.timeEnd('find'); // 输出: find: 2.56298828125 ms

4. 链式调用差异

// filter可以继续链式调用
users
  .filter(user => user.active)
  .map(user => user.name)
  .forEach(name => console.log(name));
// 输出: 
// Alice
// Charlie
// David

// find不能链式调用数组方法(因为返回的是元素)
const userName = users.find(user => user.id === 2).name; // 直接访问属性
console.log(userName) //输出: Bob

5. 实际应用场景

适合使用 filter() 的情况:

  • 需要获取所有匹配项

  • 需要对结果集进行进一步操作(如再过滤、映射等)

  • 需要确保总是返回数组(便于后续处理)

// 获取所有未完成的任务
const incompleteTasks = tasks.filter(task => !task.completed);

// 结合map使用
const activeUserNames = users
  .filter(user => user.active)
  .map(user => user.name);

适合使用 find() 的情况:

  • 只需要第一个匹配项

  • 检查数组中是否存在某个元素

  • 查找特定ID的对象

// 查找特定用户
const user = users.find(user => user.id === 3);
console.log(user) //输出: { id: 3, name: 'Charlie', active: true },

// 检查是否存在管理员
const hasAdmin = users.find(user => user.role === 'admin') !== undefined;
console.log(hasAdmin ) //输出: false

6. 特殊注意事项

引用类型:两者都返回原始数组中的引用(不会创建副本)

const found = users.find(u => u.id === 1);
found.name = 'Alex'; // 会修改原数组中的对象
console.log(users) 
//输出: [
//  { id: 1, name: 'Alex', active: true },
//  { id: 2, name: 'Bob', active: false },
//  { id: 3, name: 'Charlie', active: true },
//  { id: 4, name: 'David', active: true }
// ]

稀疏数组

const sparse = [1, , 3];
sparse.find(x => true); // 1 (跳过空位)
sparse.filter(x => true); // [1, 3] (跳过空位)

this绑定:两者都接受第二个参数用于设置回调函数的this

const checker = {
  threshold: 2,
  check(num) { return num > this.threshold; }
};

[1, 2, 3].find(checker.check, checker); // 3

总结选择

  • 需要 多个结果 → 用 filter()

  • 只需要 第一个结果 → 用 find()

  • 需要 性能优化(大数据集) → 优先考虑 find()

  • 需要 确保数组返回值 → 用 filter()

  • 进行 链式操作 → 用 filter()

到此这篇关于JavaScript中filter() 和find()的区别对比小结的文章就介绍到这了,更多相关JavaScript filter() 和find()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • javascript用defineProperty实现简单的双向绑定方法

    javascript用defineProperty实现简单的双向绑定方法

    这篇文章主要介绍了javascript用defineProperty实现简单的双向绑定方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 浅谈页面装载js及性能分析方法

    浅谈页面装载js及性能分析方法

    这篇文章主要简单介绍了页面装载js及性能分析方法的相关资料,需要的朋友可以参考下
    2014-12-12
  • 如何让js中的if判断如丝般顺滑详解

    如何让js中的if判断如丝般顺滑详解

    条件判断语句是程序开发过程中一种经常使用的语句形式,和大部分编程语言相同,JavaScript 中也有条件判断语句,这篇文章主要给大家介绍了关于如何让js中的if判断如丝般顺滑的相关资料,需要的朋友可以参考下
    2021-10-10
  • 动态调用CSS文件的JS代码

    动态调用CSS文件的JS代码

    动态调用CSS文件,一般用于页面的多种颜色选择,通过调用不同的css实现不用的页面颜色效果。
    2010-07-07
  • LayUi中接口传数据成功,表格不显示数据的解决方法

    LayUi中接口传数据成功,表格不显示数据的解决方法

    今天小编就为大家分享一篇LayUi中接口传数据成功,表格不显示数据的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • 基于AGS JS开发自定义贴图图层

    基于AGS JS开发自定义贴图图层

    这篇文章主要为大家详细介绍了基于AGS JS开发自定义贴图图层的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 详解JavaScript+Canvas绘制环形进度条

    详解JavaScript+Canvas绘制环形进度条

    canvas可以在页面中设定一个区域,再利用JavaScript动态地绘制图像。本文将利用canvas绘制一个可以动的环形进度条。文中的示例代码讲解详细,感兴趣的小伙伴可以动手试一试
    2022-02-02
  • 全面解读TypeScript和JavaScript的区别

    全面解读TypeScript和JavaScript的区别

    TypeScript和JavaScript是目前项目开发中较为流行的两种脚本语言, TypeScript是JavaScript的一个超集,JavaScript是一种轻量级的解释性脚本语言,本文主要介绍了两者区别,感兴趣的可以了解一下
    2023-09-09
  • 前端设计师们最常用的JS代码汇总

    前端设计师们最常用的JS代码汇总

    本文给大家整理汇总了一些做前端经常需要用的到JavaScript代码片段,非常的全面,有需要的小伙伴可以参考下
    2016-09-09
  • JavaScript中DOM操作常用事件总结

    JavaScript中DOM操作常用事件总结

    这篇文章主要为大家详细介绍了JavaScript中常用的几个DOM事件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-04-04

最新评论