多维数组扁平化需据场景选递归或迭代:递归直观易懂但深嵌套易栈溢出;迭代用栈/队列规避溢出,适合超深嵌套或不可信数据;日常开发优先递归,高风险场景必选迭代。

多维数组扁平化,本质是把嵌套任意层的数组“一层层拆开”,最终得到一个只含原始值的一维数组。递归和迭代是两种主流实现思路,适用场景和底层逻辑不同,选错可能引发性能或稳定性问题。
递归方案:直观易懂,适合常规嵌套
递归利用函数自我调用,逐层进入子数组,遇到非数组元素就收集,是最符合人类直觉的写法。
- 核心逻辑:遍历每个元素 → 若为数组,递归处理该子数组 → 否则直接推入结果数组
- 支持深度控制:可传入 depth 参数(如
flatten(arr, 2)),与原生flat(2)行为一致 - 代码简洁,调试友好,新手容易上手
- 缺点:嵌套过深(比如 1000 层)时可能触发栈溢出(
RangeError: Maximum call stack size exceeded)
迭代方案:用栈/队列规避栈溢出,适合超深嵌套
迭代不依赖函数调用栈,而是用显式的数据结构(如数组模拟栈)暂存待处理项,通过循环逐步展开。
- 典型做法:初始化栈为
[arr]→ 循环弹出一项 → 若为数组,将其所有子项逆序压入栈(保持原顺序)→ 否则推入结果 - 完全避免递归调用,内存占用可控,适合处理动态生成的深层树形数据或用户输入的不可信嵌套结构
- 需要手动管理状态,逻辑略绕;结果顺序需注意(栈为 LIFO,常需
reverse()或改用队列) - 在 Web Worker 或服务端长时间运行场景中更稳健
怎么选?看实际约束
日常业务代码、嵌套不超过 10 层、可预估数据规模 → 优先用递归,清晰可靠;
处理日志、配置文件、用户上传的 JSON、或已知可能达百层以上 → 必须用迭代,防崩溃;
如果项目已用 Lodash,_.flattenDeep() 内部就是安全的迭代实现,可直接复用。











