Z
ZHANK
编程在线教程JavaScript 教程数组方法 map/filter/reduce
数组与对象

数组方法 map/filter/reduce

掌握三大高阶数组方法及常用 API

数组三大方法 map / filter / reduce

mapfilterreduce 是函数式编程的核心,取代了大部分 for 循环。

学完本章你将: 掌握三大高阶数组方法。


map —— 转换每个元素

map 对每个元素调用函数,返回新数组。

javascript
let nums = [1, 2, 3, 4, 5];

// 翻倍
let doubled = nums.map(n => n * 2);
console.log(doubled); // [2, 4, 6, 8, 10]

// 提取属性
let users = [
    { name: "Alice", age: 25 },
    { name: "Bob", age: 30 },
    { name: "Charlie", age: 35 },
];
let names = users.map(u => u.name);
console.log(names); // ["Alice", "Bob", "Charlie"]

// map 带索引
let indexed = nums.map((n, i) => `${i}: ${n}`);
console.log(indexed); // ["0: 1", "1: 2", "2: 3", ...]

filter —— 过滤元素

filter 返回满足条件的元素组成的新数组。

javascript
let nums = [1, 2, 3, 4, 5, 6];

// 过滤偶数
let evens = nums.filter(n => n % 2 === 0);
console.log(evens); // [2, 4, 6]

// 过滤对象
let products = [
    { name: "苹果", price: 3 },
    { name: "香蕉", price: 1 },
    { name: "樱桃", price: 8 },
];
let cheap = products.filter(p => p.price < 5);
console.log(cheap); // [{ name: "苹果", price: 3 }, { name: "香蕉", price: 1 }]

// 链式调用
let result = nums
    .filter(n => n > 2)
    .map(n => n * 10);
console.log(result); // [30, 40, 50, 60]

reduce —— 聚合为单个值

javascript
let nums = [1, 2, 3, 4, 5];

// 求和
let sum = nums.reduce((acc, cur) => acc + cur, 0);
console.log(sum); // 15

// 求最大值
let max = nums.reduce((acc, cur) => Math.max(acc, cur));
console.log(max); // 5

// 数组扁平化
let nested = [[1, 2], [3, 4], [5]];
let flat = nested.reduce((acc, cur) => acc.concat(cur), []);
console.log(flat); // [1, 2, 3, 4, 5]

// 分组统计
let items = ["apple", "banana", "apple", "orange", "banana", "apple"];
let count = items.reduce((acc, item) => {
    acc[item] = (acc[item] || 0) + 1;
    return acc;
}, {});
console.log(count); // { apple: 3, banana: 2, orange: 1 }

其他实用方法

javascript
let nums = [3, 1, 4, 1, 5, 9, 2, 6];

// sort
console.log([...nums].sort((a, b) => a - b)); // 升序
console.log([...nums].sort((a, b) => b - a)); // 降序

// reverse
console.log([...nums].reverse());

// slice(不改变原数组)
console.log(nums.slice(0, 3)); // [3, 1, 4]

// concat
console.log([1, 2].concat([3, 4])); // [1, 2, 3, 4]

// flat(ES2019)
console.log([1, [2, [3]]].flat(2)); // [1, 2, 3]