JavaScript数组扁平化核心是将多层嵌套数组转为一维,可用flat()(如flat(Infinity))、递归+Array.isArray判断或栈模拟递归实现,flat()自动忽略空槽位但保留undefined/null。

JavaScript实现数组扁平化,核心是把多层嵌套的数组(比如 [1, [2, [3, 4]], 5])变成一层结构([1, 2, 3, 4, 5])。现代写法简洁高效,老环境也可兼容处理。
用 flat() 方法最简单
flat() 是 ES2019 引入的原生方法,直接支持指定展开深度:
-
arr.flat(1):只展开一层,适合已知最多嵌套两层的情况 -
arr.flat(Infinity):彻底打平,不管嵌套多少层 -
arr.flat():默认等价于flat(1)
例如:[1, [2, [3, [4]]]].flat(Infinity) → [1, 2, 3, 4]
递归 + Array.isArray 判断(兼容旧版)
不依赖新 API 时,手动递归是最清晰的思路:
- 遍历每个元素,如果是数组就递归展开,否则直接推入结果
- 用
Array.isArray()准确判断是否为数组(避免误判类数组)
示例代码:function flatten(arr) {
return arr.reduce((res, item) => {
return res.concat(Array.isArray(item) ? flatten(item) : item);
}, []);
}
用栈模拟递归(避免调用栈溢出)
对超深嵌套(如 10000 层),递归可能爆栈。改用栈结构更稳妥:
立即学习“Java免费学习笔记(深入)”;
- 把原数组放入栈中
- 每次弹出一个元素,是数组就将其子项全部压入栈;不是就推入结果数组
- 直到栈为空
这样不依赖函数调用深度,适合极端场景。
注意空槽位和非数组值
flat() 会自动忽略数组中的空槽位(如 [1, , 3] 的中间空位),但不会过滤 undefined 或 null。如果需要清理这些值,得额外用 filter(Boolean) 或自定义逻辑。










