应优先使用 Array.prototype.flat(),它原生高效、语义明确、支持深度控制;兼容旧环境时可用 reduce + 递归实现;需映射后扁平化则用 flatMap;避免 toString + split 因类型丢失导致数据失真。

直接用 Array.prototype.flat() 是最高效、最稳妥的展开方式,尤其在现代浏览器和 Node.js 环境中。它原生实现、语义明确、性能优秀,且能精准控制展开深度。
优先使用 flat() —— 官方推荐,开箱即用
flat() 是 ECMAScript 2019 正式引入的标准方法,专为数组扁平化设计:
- 不传参时默认展开一层:
[1, [2, 3], 4].flat()→[1, 2, 3, 4] - 传数字控制层级:
[1, [2, [3]]].flat(2)→[1, 2, 3] - 传
Infinity彻底展平任意深度:[1, [2, [3, [4]]]].flat(Infinity)→[1, 2, 3, 4] - 返回新数组,不修改原数组,符合函数式编程习惯
兼容旧环境?用 reduce + 递归稳住局面
若需支持 IE 或老旧运行时(如某些 Electron 旧版本),可手写轻量递归逻辑,避免栈溢出风险:
- 用
reduce替代 for 循环,代码更简洁、不易漏项 - 每次遇到子数组就递归调用自身,非数组元素直接合并
- 示例:
arr.reduce((acc, item) => acc.concat(Array.isArray(item) ? flatten(item) : item), []) - 比纯 while + concat 更易读,也比 toString + split 更安全(不丢失
null、undefined、布尔值等类型)
需要边映射边展平?flatMap 是隐藏利器
当扁平化同时要转换结构(比如提取对象字段、生成新项),flatMap 比 map + flat 组合更高效:
- 一步完成“映射 + 展平一层”,避免中间数组创建
- 例如:
[[1, 2], [3, 4]].flatMap(x => x.map(n => n * 2))→[2, 4, 6, 8] - 配合
flat(Infinity)可处理深层嵌套后的映射结果(如解析树形菜单数据)
慎用 toString + split —— 简单但有硬伤
虽一行能写完,但存在明显缺陷:
- 所有元素转为字符串,
[1, null, undefined, true, [2,3]]→['1', '', '', 'true', '2,3'] -
Number('')变成0,Number('true')变成NaN,数据失真 - 无法区分原始
0和由空值转来的0 - 仅适合已知全是数字、且允许类型丢失的极简场景










