数组的 map、filter、reduce 方法有什么区别?
请说明数组的三个核心高阶方法 map、filter、reduce 的功能、区别和搭配使用。
回答
屠龙少年
map:对每个元素执行回调,返回等长新数组
[1, 2, 3].map(x => x * 2); // [2, 4, 6]
filter:过滤元素,返回满足条件的元素组成的新数组(长度 ≤ 原数组)
[1, 2, 3].filter(x => x > 1); // [2, 3]
reduce:归约,将数组累积为单个值(任何类型)
[1, 2, 3].reduce((acc, cur) => acc + cur, 0); // 6
[1, 2, 3].reduce((acc, cur) => ({ ...acc, [cur]: cur }), {});
// { 1: 1, 2: 2, 3: 3 }
对比表: | 方法 | 返回 | 长度 | 是否改变原数组 | 用途 | |------|------|------|--------------|------| | map | 新数组 | 相同 | 否 | 数据转换 | | filter | 新数组 | ≤ 原数组 | 否 | 数据筛选 | | reduce | 任意值 | N/A | 否 | 累加/分组/转换 |
组合使用:
const result = arr
.filter(x => x.active)
.map(x => x.name)
.reduce((acc, name) => acc + name + ',', '');
注意:所有方法都不会修改原数组,回调参数为 (当前值, 索引, 原数组)。reduce 不传初始值时,以第一个元素为初始值从第二个元素开始迭代。