普通嵌套数组可以用 flat(infinity) 展开成一维。只展开一层时用 flat(1)。需要手写时,可以用栈维护待处理元素并保留原来的遍历顺序。
用 flat 控制展开深度
在现代浏览器控制台运行,比较深度不同的结果。
const input = [1, [2, [3]], 4]; console.log(JSON.stringify(input.flat(1))); console.log(JSON.stringify(input.flat(Infinity)));

依次输出 [1,2,[3],4] 和 [1,2,3,4]。输入数组保持原样。
用栈展开普通密集数组
以下实现适用于普通、无环且没有空槽的数组。子数组从右向左入栈,弹出时就能从左向右处理。
立即学习“Java免费学习笔记(深入)”;
function flatten(input) {
const stack = input.slice().reverse();
const result = [];
while (stack.length > 0) {
const item = stack.pop();
if (Array.isArray(item)) {
for (let index = item.length - 1; index >= 0; index--) {
stack.push(item[index]);
}
} else {
result.push(item);
}
}
return result;
}这一实现避免递归调用栈的深度限制。循环引用和稀疏数组需另作约定。
核对顺序和空数组
运行下面的三组检查。
console.assert(JSON.stringify(flatten([1, [2, [3]], 4])) === "[1,2,3,4]"); console.assert(JSON.stringify(flatten([[], [5, []]])) === "[5]"); console.assert(JSON.stringify(flatten([])) === "[]");
三条断言都应通过。业务能直接使用原生 flat 时,优先按所需深度调用。


















