功能说明
递归 flatten 在嵌套层级很深时会耗尽调用栈。该实现用显式栈模拟深度优先遍历,支持 Infinity 或非负整数深度限制,并按原顺序输出所有叶子值。它适合处理解析后的 JSON、树形配置和用户导入的嵌套列表。
关键代码
初始把顶层元素以层级 1 逆序压栈,保证 pop 顺序与原数组一致。弹出时若是数组且层级未超过 depth,则把子元素逆序压入并增加层级;否则写入结果。因此 depth 为 0 时返回原数组的浅拷贝,深度限制按顶层为 1 计算。
while (stack.length > 0) {
const entry = stack.pop();
if (Array.isArray(entry.value) && entry.level <= depth) {
for (let index = entry.value.length - 1; index >= 0; index -= 1) {
stack.push({ value: entry.value[index], level: entry.level + 1 });
}
} else {
output.push(entry.value);
}
}
使用注意
该函数只展开数组,不处理类数组、Set 或 Map。稀疏数组中的空槽会变成 undefined。输入不是数组或 depth 非法时抛错。结果为新数组,但叶子对象仍共享引用。深度很大时栈中可能同时保存大量元素,应留意内存。
验证方式
断言 flattenDeep([1, [2, [3]]]) 返回 [1, 2, 3]。flattenDeep([1, [2, [3]]], 1) 返回 [1, 2, [3]],depth 为 0 返回浅拷贝。depth 为 -1 或 1.5 抛 RangeError,输入非数组抛 TypeError。构造一万层嵌套数组应能完成而不触发栈溢出。