JavaScript中的数组方法:map、filter和reduce详解
原创JavaScript数组提供了许多强大的内置方法,其中map、filter和reduce是最常用且功能强大的三个方法。这些方法可以帮助我们以一种声明式的方式处理数组数据,使代码更简洁、更易读。
1. map方法
map()方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后的返回值。
基本语法:
const newArray = arr.map(callback(currentValue[, index[, array]]) { // 返回新数组的元素}[, thisArg]);示例:
const numbers = [1, 2, 3, 4];const doubled = numbers.map(num => num * 2);console.log(doubled); // [2, 4, 6, 8]// 转换对象数组const users = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 3, name: 'Charlie' }];const names = users.map(user => user.name);console.log(names); // ['Alice', 'Bob', 'Charlie']2. filter方法
filter()方法创建一个新数组,其包含通过所提供函数实现的测试的所有元素。
基本语法:
const newArray = arr.filter(callback(element[, index[, array]]) { // 返回true保留该元素,false则不保留}[, thisArg]);示例:
const numbers = [1, 2, 3, 4, 5, 6];const evens = numbers.filter(num => num % 2 === 0);console.log(evens); // [2, 4, 6]// 过滤对象数组const products = [ { id: 1, name: 'Laptop', inStock: true }, { id: 2, name: 'Phone', inStock: false }, { id: 3, name: 'Tablet', inStock: true }];const availableProducts = products.filter(product => product.inStock);console.log(availableProducts); // [{ id: 1, name: 'Laptop', inStock: true }, { id: 3, name: 'Tablet', inStock: true }]3. reduce方法
reduce()方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。
基本语法:
const result = arr.reduce(callback(accumulator, currentValue[, index[, array]]) { // 返回累积值}[, initialValue]);示例:
const numbers = [1, 2, 3, 4];const sum = numbers.reduce((acc, num) => acc + num, 0);console.log(sum); // 10// 对象数组的统计const orders = [ { id: 1, amount: 100 }, { id: 2, amount: 200 }, { id: 3, amount: 300 }];const totalAmount = orders.reduce((acc, order) => acc + order.amount, 0);console.log(totalAmount); // 600// 更复杂的例子:按属性分组const people = [ { name: 'Alice', age: 21 }, { name: 'Bob', age: 21 }, { name: 'Charlie', age: 30 }];const groupedByAge = people.reduce((acc, person) => { if (!acc[person.age]) { acc[person.age] = []; } acc[person.age].push(person); return acc;}, {});console.log(groupedByAge);/*{ '21': [ { name: 'Alice', age: 21 }, { name: 'Bob', age: 21 } ], '30': [ { name: 'Charlie', age: 30 } ]}*/方法链式调用
这些方法可以链式调用,创造出更强大的数据处理流程:
const data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];const result = data .filter(num => num % 2 === 0) // 筛选偶数 [2, 4, 6, 8, 10] .map(num => num * 2) // 每个元素乘以2 [4, 8, 12, 16, 20] .reduce((sum, num) => sum + num, 0); // 求和 4+8+12+16+20 = 60console.log(result); // 60总结
map(): 转换数组中的每个元素,生成一个对应新数组filter(): 筛选数组中的元素,生成一个包含符合条件元素的新数组reduce(): 将数组元素累积为单个值,功能最为强大这些方法不仅使代码更简洁,而且因为它们不改变原数组(纯函数),所以更符合函数式编程的原则。掌握这些方法可以显著提高处理数组数据的效率和代码的可读性。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权本站发表,未经许可,不得转载。
开发学习网




