数组方法
JavaScript 数组提供了许多强大的函数式方法,让你可以用声明式的方式处理数据。
map - 映射
将数组中的每个元素转换为新的值。
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(x => x * 2);
// [2, 4, 6, 8, 10]
const users = [{ name: 'John', age: 25 }, { name: 'Jane', age: 30 }];
const names = users.map(user => user.name);
// ['John', 'Jane']
filter - 过滤
根据条件筛选数组元素。
const numbers = [1, 2, 3, 4, 5, 6];
const evens = numbers.filter(x => x % 2 === 0);
// [2, 4, 6]
const users = [
{ name: 'John', age: 25, active: true },
{ name: 'Jane', age: 30, active: false }
];
const activeUsers = users.filter(u => u.active);
// [{ name: 'John', age: 25, active: true }]
reduce - 归约
将数组归约为单个值。
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((acc, x) => acc + x, 0);
// 15
const max = numbers.reduce((acc, x) => x > acc ? x : acc, -Infinity);
// 5
// 分组
const people = [
{ name: 'John', age: 25 },
{ name: 'Jane', age: 30 },
{ name: 'Bob', age: 25 }
];
const byAge = people.reduce((acc, p) => {
acc[p.age] = acc[p.age] || [];
acc[p.age].push(p);
return acc;
}, {});
// { 25: [{John}, {Bob}], 30: [{Jane}] }
find - 查找
查找满足条件的第一个元素。
const users = [
{ id: 1, name: 'John' },
{ id: 2, name: 'Jane' },
{ id: 3, name: 'Bob' }
];
const user = users.find(u => u.id === 2);
// { id: 2, name: 'Jane' }
some / every - 判断
const numbers = [1, 2, 3, 4, 5];
numbers.some(x => x > 4); // true(至少一个满足)
numbers.every(x => x > 0); // true(全部满足)
numbers.every(x => x > 2); // false
链式调用
这些方法可以链式组合:
const users = [
{ name: 'John', age: 25, scores: [80, 90, 85] },
{ name: 'Jane', age: 30, scores: [95, 88, 92] },
{ name: 'Bob', age: 20, scores: [70, 75, 80] }
];
const result = users
.filter(u => u.age >= 25)
.map(u => ({
name: u.name,
average: u.scores.reduce((a, b) => a + b, 0) / u.scores.length
}))
.sort((a, b) => b.average - a.average);
// [{ name: 'Jane', average: 91.67 }, { name: 'John', average: 85 }]
flat / flatMap - 扁平化
const nested = [[1, 2], [3, 4], [5, 6]];
nested.flat(); // [1, 2, 3, 4, 5, 6]
const deep = [[1, [2, 3]], [4, [5, 6]]];
deep.flat(2); // [1, 2, 3, 4, 5, 6]
// flatMap = map + flat
const sentences = ['Hello world', 'Good morning'];
const words = sentences.flatMap(s => s.split(' '));
// ['Hello', 'world', 'Good', 'morning']
最佳实践
- 优先使用函数式方法 替代 for 循环
- 保持纯函数 在回调中避免副作用
- 合理链式调用 但避免过长的链条
- 注意性能 大数据集考虑使用生成器