flat()用于按深度降维嵌套数组,默认展一层,传Infinity可彻底扁平;flatMap()先映射再展平一层,适合转换+合并场景,二者均返回新数组、不修改原数组、不支持IE。

JavaScript 中处理嵌套数组,flat() 和 flatMap() 是最直接、语义最清晰的原生方案。它们不修改原数组,返回新数组,语法简洁,逻辑稳定,比手写递归或 reduce 更可靠。
flat():按深度“拍平”嵌套结构
用于将多维数组降维,核心是控制展开层数:
- 不传参数,默认只展一层:
[1, [2, 3], [4, [5]]].flat()→[1, 2, 3, 4, [5]] - 传数字,指定展开几层:
[1, [2, [3, [4]]]].flat(2)→[1, 2, 3, [4]] - 传
Infinity,彻底扁平化任意深度:[1, [2, [3, [4, 5]]]].flat(Infinity)→[1, 2, 3, 4, 5] - 自动跳过空槽(如
[1, , 3]),但保留undefined或null元素
flatMap():先映射、再展平一层
相当于 map() + flat(1) 的组合,适合“生成子数组并合并”的场景:
- 只扁平一层,不管回调返回几层嵌套:
[1, 2].flatMap(x => [[x]])→[[1], [2]](没变) - 常用于一对多映射+过滤:
[1, 2, 3].flatMap(x => x % 2 === 0 ? [x, x] : [])→[2, 2] - 提取子数组更高效:
[[1, 2], [3], [4, 5]].flatMap(x => x)→[1, 2, 3, 4, 5](比map().flat(1)少一次内存分配) - 处理树形结构时可携带上下文:
menu.flatMap(p => p.children.map(c => ({ ...c, parent: p.id })))
实际使用注意点
两者都要求运行环境支持 ES2019(现代浏览器和 Node.js ≥ 12),不兼容 IE:
立即学习“Java免费学习笔记(深入)”;
-
flat()适合已有嵌套数组、只需降维的场景,比如清洗 API 返回的data: [[], [], []] -
flatMap()更适合边转换边合并,比如字符串分词、订单列表聚合、字段拆分(如“张三、李四”→多个对象) - 若需兼容旧环境,可用
arr.flat(Infinity)的 polyfill(基于递归或reduce),但原生方法仍是首选


















