一、为什么要使用array.fifler()
因为它简单,好用,清晰,可拓展性强,而且比for、foreach还有非常不常用的while、do...while高级,代码清晰,可读性强,代码就看起来很优雅,如果都是嵌套循环和嵌套回调,看起来就是一团乱麻,可读性差,很不优雅。
要做优雅的程序员,写优雅的代码。
array.fifler()方法就像名字一样,他就是一个过滤器,比较语义化,上手较快。
二、array.fifler()的使用与技巧
2.1、基本语法
array.filter(callback(element, index, array), thisArg)
其中callback回调函数对每个数组元素执行的函数,接受三个参数:
element:当前遍历到的元素
index (可选):当前遍历到的索引
array (可选):调用 filter 的数组本身
thisArg是执行 callback 时用作 this 的值。
2.2、返回值
一个新的数组,包含通过测试的元素。
2.3、使用技巧
综上所述,array.fifler()就是一个数组的过滤器,同时不影响数组本身的样子,返回的是一个新的数组,常用于对基础数据进行筛选,以适用于特定的情况。
应用场景:数据筛选、数据清洗和链式调用。
2.3.1、筛选数字数组中的偶数
最基础的例子,基于原始数据numbers数组,通过array.fifler()生成一个只含偶数的新数组evenNumbers。
// 示例1:筛选数组中的偶数 const numbers = [1, 2, 3, 4, 5, 6]; const evenNumbers = numbers.filter(number => number % 2 === 0); console.log(evenNumbers); // [2, 4, 6]
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);
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);
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)}%`);
三、总结
用array.filter()来实现数据筛选、数据清洗和链式调用,相对于for循环更加清晰,语义化强,能显著提升代码的可读性和可维护性。
更多前端好文:各种前端问题的技巧和解决方案
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~