380 字
2 分钟
数组扁平化
常用方法
1. Array.prototype.flat
(ES6推荐方法)
TIP 实现数组的”拉平”(扁平化),该方法返回一个新数组,对原数据没有影响。
具有一个可选参数
depth
,用来指定深度,默认为1 传入’Infinity’可以拉平任意深度的数组
const arr = [4, 1, 2, 3, 6, [7, 8, [3, 9, 10, [4, 6, 11]]]]
console.log(arr.flat()) // [4, 1, 2, 3, 6, 7, 8, [3, 9, 10, [4, 6, 11]]]
console.log(arr.flat(2)) // [4, 1, 2, 3, 6, 7, 8, 3, 9, 10, [4, 6, 11]]
console.log(arr.flat(Infinity)) // [4, 1, 2, 3, 6, 7, 8, 3, 9, 10, 4, 6, 11]
2. 递归
function flatten(arr) {
return arr.reduce((acc, cur) => {
return acc.concat(Array.isArray(cur) ? flatten(cur) : cur);
}, []);
}
// 示例
flatten([1, [2, [3]]]); // [1, 2, 3]
3. 迭代展开
function flatten(arr) {
while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}
// 示例
flatten([1, [2, [3]]]); // [1, 2, 3]
4. toString 转换(仅适用于纯数字/字符串数组)
[1, [2, [3]]].toString().split(',').map(Number); // [1, 2, 3]
// 注意:会强制转换元素类型(如 'a' → NaN)
5. Generator 函数(高级场景)
function* flatten(arr) {
for (const item of arr) {
Array.isArray(item) ? yield* flatten(item) : yield item;
}
}
// 示例
[...flatten([1, [2, [3]]])]; // [1, 2, 3]
总结
方法 | 优点 | 缺点 |
---|---|---|
Array.prototype.flat | 原生语法,简洁高效 | 兼容性需注意(IE 不支持) |
递归实现 | 兼容性好,可控性强 | 嵌套过深可能栈溢出 |
扩展运算符迭代 | 无递归栈溢出风险 | 性能较差(多次浅拷贝) |
toString | 单行代码实现 | 仅限数字/字符串,类型可能被破坏 |
Generator | 惰性计算,适合处理超大数组 | 需要额外转换(如 [...] ) |