Array.prototype.flatMap()是ES2019引入的数组方法,先对每个元素执行映射函数(返回数组或可迭代对象),再将结果浅层展平一层;等价于map().flat(1),但性能更优、语义更明确。

Array.prototype.flatMap 是 JavaScript 中一个非常实用的方法,它把 map 和 flat(1) 合并成一步:先对每个元素执行映射函数(返回一个数组),再将所有结果数组**浅层展平一层**。
基本用法:map + 一层 flat 的组合
它等价于:arr.map(callback).flat(1),但更高效、更简洁。
- 只展平**最外层嵌套的一层**,不会递归展平多层数组
- 映射函数必须返回数组(或类数组/可迭代对象),否则会被转为空数组
[] - 如果返回非数组值(如字符串、数字、
undefined),会自动包装成单元素数组再展平 —— 实际效果相当于被忽略(因为[42].flat(1) === [42],但若返回undefined,则变成[undefined].flat(1) === [undefined];注意:返回undefined不等于跳过,真正跳过需返回空数组[])
常见使用场景
拆分字符串并过滤空项
['a,b', 'c,,d', 'e'].flatMap(s => s.split(','))
// → ['a', 'b', 'c', '', 'd', 'e']想过滤掉空字符串?在 map 阶段处理:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
['a,b', 'c,,d', 'e'].flatMap(s => s.split(',').filter(x => x))
// → ['a', 'b', 'c', 'd', 'e']展开子数组并转换结构
const users = [
{ id: 1, tags: ['js', 'web'] },
{ id: 2, tags: ['rust'] },
{ id: 3, tags: [] }
];
<p>users.flatMap(u => u.tags.map(tag => ({ userId: u.id, tag })))
// → [
// { userId: 1, tag: 'js' },
// { userId: 1, tag: 'web' },
// { userId: 2, tag: 'rust' }
// ]和 map + flat 的关键区别
虽然语义上等价,但 flatMap 更明确表达“映射后展平一层”的意图,且性能略优(避免中间数组的创建)。
-
[1, 2, 3].map(x => [x, x+1])→[[1,2], [2,3], [3,4]] -
[1, 2, 3].flatMap(x => [x, x+1])→[1,2,2,3,3,4] -
[1, 2, 3].flatMap(x => [[x]])→[[1], [2], [3]](只展平一层,内层数组保留)
注意事项
返回值不是数组时,行为可能出乎意料:
-
[1, 2].flatMap(x => x * 2)→[2, 4](数字被自动包装为[2]、[4],再展平) -
[1, 2].flatMap(x => null)→[null](null被包装为[null]) -
[1, 2].flatMap(x => [])→[](空数组展平后消失,实现“条件排除”)
需要深度展平?得配合 flat(Infinity) 或递归处理,flatMap 本身不支持。

















