flatmap的核心能力是在一次遍历中完成“映射+展开一层嵌套”,专为“一对多映射后合并结果”设计,仅扁平化第一层,不递归;需回调返回数组,所有返回数组被拼接成新数组。

flatMap 的核心能力是在一次遍历中完成“映射 + 展开一层嵌套”,它不是递归扁平化工具,而是专为“一对多映射后合并结果”设计的原生方法。
flatMap 只展开第一层,不递归处理
它对每个元素执行回调函数,该函数必须返回一个数组;flatMap 会把所有返回的数组拼接成一个新数组,但仅合并最外层结构。例如:
-
[1, [2, 3], 4].flatMap(x => Array.isArray(x) ? x : [x])→[1, 2, 3, 4] -
[[1, [2, 3]], [4]].flatMap(x => x)→[1, [2, 3], 4](不会变成[1, 2, 3, 4])
想展平更深嵌套?配合 flat(Infinity)
如果原始数据有多层嵌套,且你希望最终得到完全一维的结果,推荐先用 flatMap 映射,再用 flat(Infinity) 彻底摊平:
-
[[1, [2, 3]], [4, [5, [6]]]].flatMap(x => x).flat(Infinity)→[1, 2, 3, 4, 5, 6] - 注意:flatMap 本身不接受 depth 参数,深度控制必须交给后续的 flat()
常见实用组合:提取对象嵌套属性并展平
面对对象数组,比如每个对象有个 tags 数组字段,你想提取所有 tag 并合并成单个列表:
const data = [{ id: 1, tags: ['js', 'web'] }, { id: 2, tags: ['node'] }];-
data.flatMap(item => item.tags)→['js', 'web', 'node'] - 若
tags可能为null或undefined,加保护:data.flatMap(item => item.tags ?? [])
和 map().flat() 的区别不只是写法
虽然 arr.map(fn).flat() 看似等价,但 flatMap 是单次遍历,性能更好,语义更明确:
- map().flat() 先生成中间二维数组,再遍历合并,内存和时间开销略高
- flatMap 内部优化为边映射边收集,避免临时数组,尤其在大数据量时优势明显
- 浏览器和 Node.js 原生支持,无需 polyfill(IE 除外)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











