多维数组展平为一维的核心是递归遍历或迭代展开所有嵌套层级,跳过非数组元素;flat()方法最简但兼容性差,手写递归兼容性强,迭代法防栈溢出,混合类型需展平后额外处理。

多维数组展平为一维,核心在于递归遍历或迭代展开所有嵌套层级,跳过非数组元素(如字符串、数字),只对数组类型继续拆解。
使用 flat() 方法(最简方式)
ES2019 引入的 flat() 是最直接的方案,默认展开一层;传入 Infinity 可完全展平任意深度:
-
[1, [2, [3, 4]], 5].flat(Infinity)→[1, 2, 3, 4, 5] - 不支持旧浏览器(IE 不兼容),需考虑兼容性时慎用
手写递归展平(兼容性强)
定义一个函数,判断每个元素是否为数组:是则递归调用,否则直接推入结果数组:
-
// 示例:
function flatten(arr) {<br> return arr.reduce((acc, item) => {<br> return Array.isArray(item)<br> ? acc.concat(flatten(item))<br> : acc.concat(item);<br> }, []);<br>} - 能处理含空数组、null、undefined 等边界值(它们不会被递归,原样保留)
使用栈模拟迭代(避免深层递归栈溢出)
对极深嵌套数组(如上百层),递归可能触发“Maximum call stack size exceeded”。改用栈结构逐层展开更安全:
- 初始化栈为原数组副本,结果数组为空
每次弹出一项,若为数组则将其元素逆序压入栈(保证顺序),否则推入结果 -
// 简化版:
function flattenIterative(arr) {<br> const stack = [...arr];<br> const result = [];<br> while (stack.length) {<br> const item = stack.pop();<br> if (Array.isArray(item)) {<br> stack.push(...item.reverse()); // 逆序保证原顺序<br> } else {<br> result.push(item);<br> }<br> }<br> return result.reverse();<br>}
注意混合类型与特殊值
展平时需明确需求:是否保留字符串、对象、null?flat() 和上述递归/迭代方法默认只展开数组,其他类型原样保留。若需过滤或转换,应在展平后额外处理:
- 去除非数组项:
flatten(arr).filter(item => item != null && typeof item !== 'string') - 统一转数字:
flatten(arr).map(Number)(注意 '1' → 1,'' → 0,NaN 需单独处理)

















