深度遍历多维数组是逐层探入嵌套结构直至叶子节点的通用方法,支持任意不规则嵌套深度,可通过递归、显式栈或flat(Infinity)实现,并需处理null、undefined等边界情况。

什么是深度遍历多维数组
深度遍历多维数组,是指不依赖固定维度层数,而是逐层探入嵌套结构,直到触达最内层的非数组值(即“叶子节点”)。它和传统嵌套 for 循环不同——后者要求你提前知道是二维、三维还是更高维;而深度遍历能自动适配任意嵌套深度,包括不规则结构(如 [1, [2, [3]], [[4, 5], 6]])。
递归实现(最直观)
递归是最自然的表达方式:遇到数组就继续调用自身,否则处理当前值。
- 检查当前项是否为数组(
Array.isArray(item)) - 是数组 → 对每个子项递归调用遍历函数
- 不是数组 → 执行你需要的操作(打印、收集、转换等)
示例代码:
function deepTraverse(arr, callback) {<br> for (let item of arr) {<br> if (Array.isArray(item)) {<br> deepTraverse(item, callback);<br> } else {<br> callback(item);<br> }<br> }<br>}<br><br>// 使用:<br>deepTraverse([1, [2, [3, 4]], 5], console.log); // 输出 1 2 3 4 5
栈模拟递归(避免调用栈溢出)
对超深嵌套(如上万层)或需严格控制执行流的场景,可用显式栈替代递归,防止栈溢出。
- 初始化一个栈,把整个数组推入
- 循环弹出栈顶元素
- 若为数组,将其所有子项逆序压入栈(保证原顺序遍历)
- 若为普通值,直接执行回调
关键点:逆序压入是为了让第一个子项最先被处理,维持“深度优先 + 左→右”顺序。
扁平化后遍历(语义更清晰)
如果只需访问所有值,不关心层级路径,可先用 flat(Infinity) 归一化,再统一处理。
-
arr.flat(Infinity).forEach(callback)—— 简洁明了,适合聚合类操作(求和、过滤、映射) - 注意:
flat()会创建新数组,内存开销略大;不适用于需要保留原始结构上下文的场景 - 兼容性差时可用
JSON.stringify + 正则提取数字/字符串替代,但仅限简单数据类型
处理边界情况
真实数据常含空数组、null、undefined 或混合类型,建议在遍历时加固判断:
- 跳过
null和undefined(item == null) - 空数组直接跳过内层循环,避免冗余迭代
- 若需区分原始位置,可在递归中传入路径数组(如
[0, 1, 2]),用于调试或映射回源结构

















