js flat实现
数组扁平化的概念
数组扁平化是指将多维数组转换为一维数组的过程。例如,将 [1, [2, [3, [4]], 5]] 转换为 [1, 2, 3, 4, 5]。

使用 Array.prototype.flat()
ES2019 引入了 flat() 方法,可以方便地实现数组扁平化。该方法接受一个可选的参数 depth,表示要扁平化的深度,默认值为 1。
const arr = [1, [2, [3, [4]], 5]];
// 默认扁平化一层
console.log(arr.flat()); // [1, 2, [3, [4]], 5]
// 指定深度为 2
console.log(arr.flat(2)); // [1, 2, 3, [4], 5]
// 使用 Infinity 完全扁平化
console.log(arr.flat(Infinity)); // [1, 2, 3, 4, 5]
手动实现扁平化
如果需要在不支持 flat() 的环境中使用,可以手动实现扁平化功能。
递归实现
function flatten(arr) {
return arr.reduce((acc, val) => {
return acc.concat(Array.isArray(val) ? flatten(val) : val);
}, []);
}
const arr = [1, [2, [3, [4]], 5]];
console.log(flatten(arr)); // [1, 2, 3, 4, 5]
使用 while 循环和 concat
function flatten(arr) {
while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}
const arr = [1, [2, [3, [4]], 5]];
console.log(flatten(arr)); // [1, 2, 3, 4, 5]
使用 reduce 和 concat
function flatten(arr) {
return arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatten(val) : val), []);
}
const arr = [1, [2, [3, [4]], 5]];
console.log(flatten(arr)); // [1, 2, 3, 4, 5]
性能比较
flat()方法是原生实现,性能最优。- 递归实现的性能通常优于
while循环实现,但需要注意栈溢出问题。 reduce和concat的实现简洁,但性能略低于递归实现。
注意事项
- 扁平化操作可能会改变原始数组的结构,建议在必要时进行深拷贝。
- 对于非常大的数组,递归实现可能会导致栈溢出,可以考虑使用迭代方法替代。







