参考资料
递归
let arr = [1,2,[3,[4,5,[6,7]],8],9];
function flatten(arr = []){
let res = [];
arr.forEach(v=>{
if(Array.isArray(v)){
res = res.concat(flatten(v)); // concat 不会改变数组
}else{
res.push(v);
}
})
return res;
}
console.log(flatten(arr));
代码很简单,需要注意的是concat
方法是不会改变原数组的。
reduce 处理
Array.prototype.reduce() - JavaScript | MDN (mozilla.org)
不得不说,reduce真的很方便。
let arr = [1,2,[3,[4,5,[6,7]],8],9];
function flatten(arr = []){
return arr.reduce((pre,cur)=>{
return pre.concat(Array.isArray(cur) ? flatten(cur) : cur);
},[])
}
console.log(flatten(arr));
扩展运算符
Array.prototype.some() - JavaScript | MDN (mozilla.org)
let arr = [1, 2, [3, [4, 5, [6, 7]], 8], 9];
function flatten(arr = []) {
// 判断当前数组中是否嵌套数组
while (arr.some((v) => Array.isArray(v))) {
arr = [].concat(...arr);// 这样可以解除一层的嵌套
/*
[].concat(1,[2,3]) => [1,2,3]
*/
}
return arr;
}
console.log(flatten(arr));
toString
let arr = [1, "2", [3, [4, 5, [6, 7]], 8], 9, { a: 1 }];
function flatten(arr = []) {
arr = arr.toString().split(",").map(v=>Number(v));
return arr;
}
console.log(flatten(arr));
局限性非常大,对于里面是字符串,或者引用类型就会出错。
JSON + 正则
let arr = [1, "2", [3, [4, 5, [6, 7]], 8], 9, { a: 1 }];
arr = JSON.stringify(arr).replace(/\[|\]/g,'');
arr = `[${arr}]`;
// console.log(arr);
console.log(JSON.parse(arr));
ES6 的 Array.prototype.flat()
Array.prototype.flat() - JavaScript | MDN (mozilla.org)
返回值是一个新的数组
var newArray = arr.flat([depth])
let arr = [1, "2", [3, [4, 5, [6, 7]], 8], 9, { a: 1 }];
console.log(arr.flat(Infinity));