方法1:reduce
const flattenDeep = (arr) => {
return Array.isArray(arr)
?
arr.reduce((a, b) => [...a, ...flattenDeep(b)], [])
:
[arr]
}
console.log(flattenDeep([1, [[2], [3, [4]], 5]]))
方法2:forEach
var arr = [1, 2, [3, [4, 5]]];
const eachFlat = (arr = [] , d = 1) =>{
const result = [];
(function flat(arr,d){
arr.forEach(item => {
if(Array.isArray(item) && d > 0){
flat(item , d-1);
}else{
result.push(item);
}
})
})(arr,d)
return result;
}
console.log(eachFlat(arr,Infinity))
方法3: 逐项遍历(较为简单且好理解)
var flat = function (arr, n) {
while (n--) {
let temp = [];
for (let item of arr) {
if (Array.isArray(item)) {
temp.push(...item);
} else {
temp.push(item);
}
}
arr = temp;
}
return arr;
};
上面的代码存在一定的性能问题,有一些特长用例可能会超时,下面是优化后的代码:
var flat = function (arr, n) {
while (n--) {
arr = [].concat(...arr);
}
return arr;
};
方法4:Generator
var arr = [1, 2, [3, [4, 5]]];
function* flatten(array){
for(const item of array){
if(Array.isArray(item)){
yield* flatten(item)
}else{
yield item;
}
}
}
const res = [...flatten(arr)]
console.log(res)