js实现flatten
实现数组扁平化的方法
使用递归方法
递归是最直观的实现方式,通过遍历数组元素,遇到子数组时递归调用自身。
function flatten(arr) {
let result = [];
arr.forEach(item => {
if (Array.isArray(item)) {
result = result.concat(flatten(item));
} else {
result.push(item);
}
});
return result;
}
使用reduce方法
reduce方法可以更简洁地实现扁平化,结合递归处理嵌套数组。
function flatten(arr) {
return arr.reduce((acc, val) =>
acc.concat(Array.isArray(val) ? flatten(val) : val), []);
}
使用ES6的flat方法
现代JavaScript提供了原生扁平化方法,可以指定扁平化深度。
// 完全扁平化
const flattened = arr.flat(Infinity);
// 指定扁平化层级
const flattenedLevel1 = arr.flat(1);
使用扩展运算符
对于浅层扁平化(一层),可以使用扩展运算符结合concat。
function flattenOneLevel(arr) {
return [].concat(...arr);
}
使用Generator函数
对于大型数组,可以使用生成器实现惰性求值。
function* flattenGenerator(arr) {
for (const item of arr) {
if (Array.isArray(item)) {
yield* flattenGenerator(item);
} else {
yield item;
}
}
}
const flattened = [...flattenGenerator(nestedArray)];
性能考虑
对于大型深层嵌套数组,递归方法可能导致堆栈溢出。这时可以使用迭代方法:

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();
}
每种方法各有优缺点,递归方法代码简洁但可能堆栈溢出,迭代方法更安全但代码稍复杂,原生flat方法最简洁但需要考虑浏览器兼容性。






