本文目录导读:

我来给你展示几个实用的 filter 和 map 组合案例。
基础用法
案例1:筛选并转换用户数据
const users = [
{ name: '小明', age: 18, isActive: true },
{ name: '小红', age: 25, isActive: false },
{ name: '小刚', age: 30, isActive: true },
{ name: '小丽', age: 22, isActive: true }
];
// 筛选活跃用户,并只返回他们的名字和年龄
const activeUsers = users
.filter(user => user.isActive)
.map(user => `${user.name}(${user.age}岁)`);
console.log(activeUsers); // ['小明(18岁)', '小刚(30岁)', '小丽(22岁)']
案例2:商品价格处理
const products = [
{ name: '手机', price: 5999, inStock: true },
{ name: '电脑', price: 8999, inStock: false },
{ name: '耳机', price: 999, inStock: true },
{ name: '键盘', price: 399, inStock: true },
{ name: '平板', price: 3999, inStock: false }
];
// 筛选有货且价格低于5000的商品,然后添加折扣价
const discountedProducts = products
.filter(p => p.inStock && p.price < 5000)
.map(p => ({
name: p.name,
originalPrice: p.price,
discountPrice: p.price * 0.9, // 9折
save: p.price * 0.1
}));
console.log(discountedProducts);
// [{name: '耳机', originalPrice: 999, discountPrice: 899.1, save: 99.9}, ...]
高级应用
案例3:对象数组的复杂筛选
const students = [
{ id: 1, name: '张三', scores: { math: 95, english: 82, chinese: 88 } },
{ id: 2, name: '李四', scores: { math: 72, english: 90, chinese: 65 } },
{ id: 3, name: '王五', scores: { math: 88, english: 75, chinese: 92 } },
{ id: 4, name: '赵六', scores: { math: 60, english: 70, chinese: 55 } }
];
// 找出所有科目都及格的学生,并计算他们的平均分
const passingStudents = students
.filter(student =>
Object.values(student.scores).every(score => score >= 60)
)
.map(student => ({
name: student.name,
average: (Object.values(student.scores).reduce((a, b) => a + b, 0) / 3).toFixed(1),
isGood: student.scores.math >= 85 && student.scores.chinese >= 85
}));
console.log(passingStudents);
案例4:字符串数组处理
const emails = ['john@gmail.com', 'invalid-email', 'jane@yahoo.com', 'test@', 'bob@hotmail.com'];
// 过滤无效邮箱,并提取域名
const validDomains = emails
.filter(email => email.includes('@') && email.split('@')[1].includes('.'))
.map(email => email.split('@')[1]);
console.log(validDomains); // ['gmail.com', 'yahoo.com', 'hotmail.com']
实际业务场景
案例5:订单处理系统
const orders = [
{ id: 'A001', items: ['手机', '壳'], total: 6200, status: 'completed' },
{ id: 'A002', items: ['电脑'], total: 8999, status: 'pending' },
{ id: 'A003', items: ['耳机', '键盘', '鼠标'], total: 1500, status: 'completed' },
{ id: 'A004', items: ['显示器'], total: 2500, status: 'cancelled' },
{ id: 'A005', items: ['键盘', '键盘', '键盘'], total: 1200, status: 'completed' }
];
// 获取已完成订单的汇总信息
const completedOrderSummary = orders
.filter(order => order.status === 'completed')
.map(order => ({
orderId: order.id,
itemCount: order.items.length,
uniqueItems: new Set(order.items).size,
total: `¥${order.total}`,
isBigOrder: order.total > 5000
}));
console.log(completedOrderSummary);
案例6:数据处理管道
// 从API获取的数据
const rawData = [
{ name: '项目A', budget: 100000, spent: 45000, risk: 'high' },
{ name: '项目B', budget: 50000, spent: 55000, risk: 'low' },
{ name: '项目C', budget: 200000, spent: 80000, risk: 'medium' },
{ name: '项目D', budget: 30000, spent: 15000, risk: 'low' }
];
// 找出有风险的项目(超支或高风险),并格式化数据
const riskyProjects = rawData
.filter(project =>
project.risk === 'high' ||
project.spent > project.budget * 0.7 // 花费超预算70%
)
.map(project => ({
projectName: project.name.toUpperCase(),
budgetUtilization: `${Math.round((project.spent / project.budget) * 100)}%`,
status: project.spent > project.budget ? '超支' : '在预算内',
alert: project.spent > project.budget ? '⚠️' : ''
}));
console.log(riskyProjects);
性能优化技巧
// 方法1:使用链式调用(可读性好,但会遍历两次)
const result1 = array.filter(fn1).map(fn2);
// 方法2:使用 reduce 代替(只遍历一次)
const result2 = array.reduce((acc, item) => {
if (fn1(item)) {
acc.push(fn2(item));
}
return acc;
}, []);
// 方法3:使用 flatMap
const result3 = array.flatMap(item =>
fn1(item) ? [fn2(item)] : []
);
实用小技巧
// 转为数字数组并过滤NaN const mixed = ['1', '2', '3', 'abc', '4', 'def']; const numbers = mixed .map(Number) .filter(n => !isNaN(n)); // [1, 2, 3, 4] // 去重 const duplicate = [1, 2, 2, 3, 3, 4, 5, 5]; const unique = duplicate .filter((value, index, self) => self.indexOf(value) === index); // [1, 2, 3, 4, 5] // 或者使用更简洁的方式 const unique2 = [...new Set(duplicate)];
这些案例展示了 filter 和 map 组合使用的强大功能,可以根据实际需求灵活组合,希望这些例子对你有帮助!
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播