最直接的方式是用原生flat()方法,它专为数组扁平化设计,语法简洁、行为可控、性能可靠:不传参默认展一层,传数字控制深度,传infinity彻底展平,自动跳过顶层空槽,但保留null/undefined等值。

最直接的方式是用原生 flat() 方法,它专为这个需求设计,语法简洁、行为可控、性能可靠。
用 flat() 一键展平
这是现代 JavaScript(ES2019+)的标准方案,无需额外依赖:
- 不传参数:只展开第一层嵌套
[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, , 2]中的空位),但保留null、undefined等真实值
兼容老环境:reduce + 递归
当需支持 IE 或旧版 Node.js 时,手写一个轻量可靠的替代函数:
- 核心逻辑:遍历每个元素,是数组就递归处理,否则直接加入结果
- 安全判断必须用
Array.isArray(item),避免把对象、null、日期等误判为数组 - 示例代码:
function flatten(arr, depth = Infinity) {
if (depth === 0) return arr;
return arr.reduce((acc, item) =>
acc.concat(Array.isArray(item) ? flatten(item, depth - 1) : item), []);
}
二维数组快速处理:扩展运算符 + concat
适合明确知道只有两层嵌套、追求极简写法的场景:
-
[].concat(...arr)或[].concat.apply([], arr) - 例如:
const twoD = [1, [2, 3], 4]; [].concat(...twoD)→[1, 2, 3, 4] - 注意:遇到三层结构(如
[1, [2, [3]]])会残留内层数组,不适用于深度不确定的情况
慎用的“快捷方式”
某些写法看似简短,但隐患明显,仅限调试或绝对受控的玩具数据:
-
arr.toString().split(',').map(Number):所有元素变字符串再转数字,对象变成"[object Object]",true/false变"true"/"false" -
JSON.stringify + 正则 + JSON.parse:丢失undefined、function、Symbol、BigInt,性能差,易出错 - 这些方法绕过了类型和结构语义,上线项目中应避免
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











