js数组拍平(数组扁平化)的六种方式

851 阅读1分钟

数组拍平也称数组扁平化,就是将数组里面的数组打开,最后合并为一个数组。

实现方式有如下几种:

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

//toString()会把数组转换成用逗号分割的字符转
//[1,2,[3,4,5,[6,7,8],9],10,[11,12]].toString()
//=>'1,2,3,4,5,6,7,8,9,10,11,12'

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;
}