JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)

简介: 用array.filter()来实现数据筛选、数据清洗和链式调用,相对于for循环更加清晰,语义化强,能显著提升代码的可读性和可维护性。博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~


image.gif 编辑

一、为什么要使用array.filter()

       因为它简单,好用,清晰,可拓展性强,而且比for、foreach还有非常不常用的while、do...while高级,代码清晰,可读性强,代码就看起来很优雅,如果都是嵌套循环和嵌套回调,看起来就是一团乱麻,可读性差,很不优雅。

       要做优雅的程序员,写优雅的代码。

       array.filter()方法就像名字一样,他就是一个过滤器,比较语义化,上手较快。

二、array.filter()的使用与技巧

2.1、基本语法

array.filter(callback(element, index, array), thisArg)

       其中callback回调函数对每个数组元素执行的函数,接受三个参数:

  • element:当前遍历到的元素
  • index (可选):当前遍历到的索引
  • array (可选):调用 filter 的数组本身

       thisArg是执行 callback 时用作 this 的值。

2.2、返回值

       一个新的数组,包含通过测试的元素。

2.3、使用技巧

       综上所述,array.filter()就是一个数组的过滤器,同时不影响数组本身的样子,返回的是一个新的数组,常用于对基础数据进行筛选,以适用于特定的情况。

       应用场景:数据筛选、数据清洗和链式调用。

2.3.1、筛选数字数组中的偶数

       最基础的例子,基于原始数据numbers数组,通过array.filter()生成一个只含偶数的新数组evenNumbers。

// 示例1:筛选数组中的偶数
const numbers = [1, 2, 3, 4, 5, 6];
const evenNumbers = numbers.filter(number => number % 2 === 0);
console.log(evenNumbers); // [2, 4, 6]

image.gif

2.3.2、数据筛选:筛选出高价值客户

       假设有一个客户消费记录的数组,我们想要筛选出过去一年内消费总额超过10000元且订单数量超过5个的高价值客户。

// 示例2:筛选出高价值客户
const customers = [
  { id: 1, name: 'Alice', orders: [
    { amount: 1200, date: '2023-05-15' },
    { amount: 2500, date: '2023-07-22' },
    { amount: 1800, date: '2023-08-05' }
  ]},
  { id: 2, name: 'Bob', orders: [
    { amount: 9000, date: '2023-03-01' },
    { amount: 2200, date: '2023-09-12' }
  ]},
  { id: 3, name: 'Charlie', orders: [
    { amount: 750, date: '2023-02-17' },
    { amount: 1100, date: '2023-04-03' },
    { amount: 1500, date: '2023-05-09' },
    { amount: 1300, date: '2023-06-21' }
  ]},
  { id: 4, name: 'David', orders: [
    { amount: 2000, date: '2023-01-05' },
    { amount: 1700, date: '2023-02-20' },
    { amount: 2300, date: '2023-03-18' }
  ]},
  { id: 5, name: 'Eve', orders: [
    { amount: 3500, date: '2023-04-08' },
    { amount: 4200, date: '2023-05-22' }
  ]},
  { id: 6, name: 'Frank', orders: [
    { amount: 550, date: '2023-03-02' },
    { amount: 850, date: '2023-08-16' }
  ]},
  // ... 更多客户
];
const highValueCustomers = customers.filter(customer => {
  const totalSpent = customer.orders.reduce((sum, order) => {
    const orderDate = new Date(order.date);
    const oneYearAgo = new Date();
    oneYearAgo.setFullYear(oneYearAgo.getFullYear() - 1);
    return sum + (orderDate >= oneYearAgo ? order.amount : 0);
  }, 0);
  return totalSpent > 10000 && customer.orders.length > 5;
});
console.log(highValueCustomers);

image.gif

2.3.3、数据清洗:移除无效的用户记录

       假设我们有一个包含用户注册信息的数组,我们想要移除那些邮箱地址无效或密码长度不符合要求的用户记录。

// 示例3:移除无效的用户记录
const users = [
  { id: 1, name: 'Alice', email: 'alice', password: 'alice123' },
  { id: 2, name: 'Bob', email: 'bob@example.com', password: 'b' },
  { id: 3, name: 'Charlie', email: 'charlie@work.com', password: 'Ch@rl1e!' },
  { id: 4, name: 'Diana', email: 'diana', password: 'D123456' },
  { id: 5, name: 'Edward', email: 'edward@', password: 'edwardpassword' },
  { id: 6, name: 'Fiona', email: 'fiona123', password: 'fionaP@ss' },
  { id: 7, name: 'George', email: 'george@example.com', password: 'g' },
  { id: 8, name: 'Hannah', email: 'hannah@hann.com', password: 'HannahPass123!' },
  { id: 9, name: 'Ivan', email: 'ivan', password: 'IvanIvanIvan' },
  { id: 10, name: 'Julia', email: 'julia@julia', password: 'ju@123' },
  // ... 更多用户
];
const validUsers = users.filter(user => {
  // 使用正则表达式验证邮箱格式
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  // 密码长度至少为6个字符
  return emailRegex.test(user.email) && user.password.length >= 6;
});
console.log(validUsers);

image.gif

2.3.4、链式调用:计算员工的平均薪资增长

       假设我们有一个员工薪资记录的数组,我们想要找出过去两年内薪资增长超过10%的员工,并且计算他们的平均薪资增长百分比。

// 示例4:计算员工的平均薪资增长
const employees = [
  { id: 1, name: 'Alice', salary: 5000, salaryTwoYearsAgo: 4000 },
  { id: 2, name: 'Bob', salary: 6500, salaryTwoYearsAgo: 7000 },
  { id: 3, name: 'Charlie', salary: 8000, salaryTwoYearsAgo: 6500 },
  { id: 4, name: 'David', salary: 7200, salaryTwoYearsAgo: 6000 },
  { id: 5, name: 'Eve', salary: 9500, salaryTwoYearsAgo: 8200 },
  { id: 6, name: 'Frank', salary: 6800, salaryTwoYearsAgo: 5800 },
  { id: 7, name: 'Grace', salary: 7800, salaryTwoYearsAgo: 7200 },
  { id: 8, name: 'Heidi', salary: 9200, salaryTwoYearsAgo: 8500 },
  { id: 9, name: 'Ivan', salary: 6300, salaryTwoYearsAgo: 5500 },
  { id: 10, name: 'Judy', salary: 8600, salaryTwoYearsAgo: 7800 },
  // ... 更多员工
];
const averageSalaryGrowth = employees
  .filter(employee => {
    const growth = (employee.salary - employee.salaryTwoYearsAgo) / employee.salaryTwoYearsAgo;
    return growth > 0.10;
  })
  .map(employee => {
    const growth = (employee.salary - employee.salaryTwoYearsAgo) / employee.salaryTwoYearsAgo;
    return growth * 100; // 转换为百分比
  })
  .reduce((totalGrowth, growth) => totalGrowth + growth, 0) / employees.length;
console.log(`The average salary growth over the past two years is: ${averageSalaryGrowth.toFixed(2)}%`);

image.gif

三、总结

       用array.filter()来实现数据筛选、数据清洗和链式调用,相对于for循环更加清晰,语义化强,能显著提升代码的可读性和可维护性。

       更多前端好文:各种前端问题的技巧和解决方案

       博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

相关文章
|
1月前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
1月前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
1月前
|
前端开发 JavaScript 数据格式
通过array.reduce()实现数据汇总、条件筛选和映射、对象属性的扁平化、转换数据格式、聚合统计、处理树结构数据和性能优化,reduce()的使用详解(附实际应用代码)
array.reduce()可以用来数据汇总、条件筛选和映射、对象属性的扁平化、转换数据格式、聚合统计、处理树结构数据、性能优化等,使用难度相对高一些,但是能大大减少代码量。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时
|
1月前
|
移动开发 运维 供应链
通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
array.some()可以用来权限检查、表单验证、库存管理、内容审查和数据处理等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
1月前
|
供应链 JavaScript 前端开发
通过array.every()实现数据验证、权限检查和一致性检查;js数组元素检查的方法,every()的使用详解,array.some与array.every的区别(附实际应用代码)
array.every()可以用来数据验证、权限检查、一致性检查等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
1月前
|
Web App开发 存储 前端开发
别再用双层遍历循环来做新旧数组对比,寻找新增元素了!使用array.includes和Set来提升代码可读性
这类问题的重点在于能不能突破基础思路,突破基础思路是从程序员入门变成中级甚至高级的第一步,如果所有需求都通过最基础的业务逻辑来做,是得不到成长的。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
1月前
|
数据采集 监控 JavaScript
Array.forEach实战详解:简化循环与增强代码可读性;Array.forEach怎么用;面对大量数据时怎么提高Array.forEach的性能
只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
1月前
|
人工智能 Java
Java 中数组Array和列表List的转换
本文介绍了数组与列表之间的相互转换方法,主要包括三部分:1)使用`Collections.addAll()`方法将数组转为列表,适用于引用类型,效率较高;2)通过`new ArrayList<>()`构造器结合`Arrays.asList()`实现类似功能;3)利用JDK8的`Stream`流式计算,支持基本数据类型数组的转换。此外,还详细讲解了列表转数组的方法,如借助`Stream`实现不同类型数组间的转换,并附带代码示例与执行结果,帮助读者深入理解两种数据结构的互转技巧。
Java 中数组Array和列表List的转换
|
4月前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
139 67
|
6月前
|
人工智能 前端开发 JavaScript
拿下奇怪的前端报错(一):报错信息是一个看不懂的数字数组Buffer(475) [Uint8Array],让AI大模型帮忙解析
本文介绍了前端开发中遇到的奇怪报错问题,特别是当错误信息不明确时的处理方法。作者分享了自己通过还原代码、试错等方式解决问题的经验,并以一个Vue3+TypeScript项目的构建失败为例,详细解析了如何从错误信息中定位问题,最终通过解读错误信息中的ASCII码找到了具体的错误文件。文章强调了基础知识的重要性,并鼓励读者遇到类似问题时不要慌张,耐心分析。
147 5

热门文章

最新文章

下一篇
oss创建bucket