js flatten 简单实现
使用 Array.prototype.reduce() 和递归
通过递归遍历数组,遇到子数组时继续展开,最终合并为单层数组。
function flatten(arr) {
return arr.reduce((acc, item) =>
Array.isArray(item)
? acc.concat(flatten(item))
: acc.concat(item),
[]
);
}
使用 Array.prototype.flat()(ES2019原生方法)
现代浏览器支持的原生方法,直接指定展开深度即可。无限深度可用 Infinity。
const arr = [1, [2, [3]]];
const flattened = arr.flat(Infinity); // [1, 2, 3]
迭代实现(避免递归栈溢出)
通过循环逐层展开子数组,适合处理超大嵌套结构。
function flatten(arr) {
let result = [];
const stack = [...arr];
while (stack.length) {
const next = stack.pop();
if (Array.isArray(next)) {
stack.push(...next);
} else {
result.unshift(next);
}
}
return result;
}
使用 Generator 惰性展开
适合逐项处理超大数组的场景,通过生成器延迟计算。
function* flattenGen(arr) {
for (const item of arr) {
Array.isArray(item)
? yield* flattenGen(item)
: yield item;
}
}
const flattened = [...flattenGen([1, [2, [3]]])]; // [1, 2, 3]
性能注意事项
- 递归方法在深度过大时可能触发栈溢出
- 迭代方法更适合处理超深嵌套结构
- 原生
flat()方法性能最优,但需考虑浏览器兼容性







