一、数组扁平化
数组扁平化就是,把多维数组将维变成一维数组,我们看一下最基本的用法
let arr = [1,2,[3,4],[5,6],7,8];//二维数组
console.log(arr.flat();)//[1,2,3,4,5,6,7,8];//一维数组
//二维以上数组
//使用官方给的方法 var flatter = arr.flat([depth]);//depth可以指定嵌套的层级 `[]`:表示可以传也可以不传,默认是1
let arr2 = [1,2,[3,4,[5,6]],[7,8]];//三维数组
console.log(arr2.flat(2));//[1,2,3,4,5,6,7,8]
二、其他的方式汇总
1.迭代实现
let arr2 = [1,2,[3,4,[5,6]],[7,8]];
while(arr2.some(item=>Array.isArray(item))){
//这个地方主要使用es6 扩展运算符 `...`
arr = [].concat(...arr);
}
return arr;// [1,2,3,4,5,6,7,8]
2.普通递归实现
let arr3 = [1,2,[3,4,5,[6,7],8],9,10,[11,[12,13]]];
const flatten = (arr)=>{
let result = [];
arr.forEach((item,i,arr)=>{
if(Array.isArray(item)){
//如果item是一个数组,那么就继续递归,直到不是数组;
result = [].concat(flatten(item));
}else{
result.push(arr[i]);
}
})
return result;//[1,2,3,4,5,6,7,8,9,10,11,12,13]
}
3.高级递归
const flatten = array=>array.reduce(pre,cur)=>(Array.isArray(cur)?[...pre,...cur]:[...pre,cur],[])
//pre 有默认值是[],所以只需先先判断cur就行了,具体的可以看reduce的默认参数。
4.toString方法
let arr4 = [1,2,3,4,[5,6,[7,8]],9,10];
console.log(arr4.toString();)//"1,2,3,4,5,6,7,8,9,10"
console.log(arr4.toString().split(','))//[1,2,3,4,5,6,7,8,9,10]
5.apply方法
使用这个方法之前我们需要知道apply这个方法是如何使用的,下面我们说一下使用这个方法的基本要求
我们可以使用 push 将元素追加到数组中。由于 push 接受可变数量的参数,所以也可以一次追加多个元素。
但是,如果 push 的参数是数组,它会将该数组作为单个元素添加,而不是将这个数组内的每个元素添加进去,因此我们最终会得到一个数组内的数组。如果不想这样呢?concat 符合我们的需求,但它并不是将元素添加到现有数组,而是创建并返回一个新数组。然而我们需要将元素追加到现有数组…那么怎么做好?难道要写一个循环吗?别当然不是!
apply 正派上用场!
let arr = [1,2,[3,4,5,[6,7],8],9,10,[11,[12,13]]];
const flatten = array=>{
while(arr.some(item=>Array.isArray(item)){
arr = [].concat.apply([],arr);
}
return arr;//[1,2,3,4,5,6,7,8,9,10,11,12,13]
}