js实现flat
实现数组扁平化的方法
使用递归方法
递归遍历数组的每个元素,判断是否为数组类型。如果是数组则继续递归,否则将元素加入结果数组。
function flattenDeep(arr) {
return arr.reduce((acc, val) =>
Array.isArray(val)
? acc.concat(flattenDeep(val))
: acc.concat(val),
[]);
}
使用迭代方法
通过循环和栈结构实现非递归的扁平化操作,适合处理深层嵌套数组。

function flattenIterative(arr) {
const stack = [...arr];
const result = [];
while (stack.length) {
const next = stack.pop();
if (Array.isArray(next)) {
stack.push(...next);
} else {
result.push(next);
}
}
return result.reverse();
}
使用ES2019的flat方法
现代JavaScript提供了原生扁平化方法,可通过参数指定展开深度。

// 展开一层
arr.flat();
// 完全展开
arr.flat(Infinity);
使用Generator实现
通过生成器函数逐步产生扁平化结果,适合处理超大数组。
function* flattenGenerator(arr) {
for (const item of arr) {
if (Array.isArray(item)) {
yield* flattenGenerator(item);
} else {
yield item;
}
}
}
const result = [...flattenGenerator(nestedArray)];
性能优化版本
针对特定场景优化的实现,使用循环代替递归避免堆栈溢出。
function flattenOptimal(arr) {
let result = [];
let queue = [arr];
let current;
while (queue.length) {
current = queue.shift();
if (Array.isArray(current)) {
queue.unshift(...current);
} else {
result.push(current);
}
}
return result;
}
每种方法适用于不同场景:递归写法简洁但可能堆栈溢出,迭代方法性能稳定但代码稍复杂,原生API最简洁但需要考虑浏览器兼容性。






