数组拍平也称数组扁平化,就是将数组里面的数组打开,最后合并为一个数组。
常用实现方式有以下几种:
var arr = [1,2,[3,4,5,[6,7,8],9],10,[11,12]];
1.递归实现
function fn(arr){
let arr1 = []
arr.forEach((val)=>{
if(val instanceof Array){
arr1 = arr1.concat(fn(val))
}else{
arr1.push(val)
}
})
return arr1
}
2.递归+reduce
function fn(arr){
return arr.reduce((prev,cur)=>{
return prev.concat(Array.isArray(cur)?fn(cur):cur)
},[])
}
3.ES6新增的嵌套数组转一维数组的方法flat
flat(n)
如果不传递参数n的话,flat函数默认只展开一层;n的值为多少就展开多少层;如果想无论多少层都展开为一维数组,则将参数值设为Infinity。flat函数在拍平过程中还会自动跳过数组中的空位。
arr.flat(Infinity)
4.扩展运算符
一层一层展开
function fn(arr){
let arr1 = [];
let bStop = true;
arr.forEach((val)=>{
if(Array.isArray(val)){
arr1.push(...val);
bStop = false
}else{
arr1.push(val)
}
})
if(bStop){
return arr1;
}
return fn(arr1)
}
5.toString
let arr1 = arr.toString().split(',').map((val)=>{
return parseInt(val)
})
console.log(arr1)
6.apply
function flatten(arr){
while(arr.some(item => Array.isArray(item))){
arr = [].concat.apply([],arr);
}
return arr;
}