数组扁平化(flatten)实现方案

299 阅读1分钟
[1,2,3,[1,2,3,[1,2]]] => [1, 2, 3, 1, 2, 3, 1, 2]

上面的转换就是数组的扁平化,将一个嵌套多层的数组 array 转换为只有一层的数组。 下面是实现数组扁平化的几种简单方法。

1. 递归

function flatten1(arr){
    let result = [];
    for(var i =0;i<arr.length;i++){
        if(Array.isArray(arr[i])){
            result = result.concat(flatten1(arr[i]));
        }else{
            result.push(arr[i]);
        }
    }
    return result;
}


flatten1([1,2,3,[1,2,3,[1,2]]])//[1, 2, 3, 1, 2, 3, 1, 2]

2. toString

function flatten2(arr){
   arr = arr.join(',').split(',');
   arr = arr.map(item=>+item); //将被转成字符串的数字转换回去;
   return arr;
}

flatten2([1,2,3,[1,2,3,[1,2]]])//[1, 2, 3, 1, 2, 3, 1, 2]

3. reduce()

function flatten3(arr){
    return arr.reduce((prev,next)=>{
        return prev.concat(Array.isArray(next)? flatten3(next) : next);
    },[])
}

flatten3([1,2,3,[1,2,3,[1,2]]])//[1, 2, 3, 1, 2, 3, 1, 2]

4. concat()

function flatten4(arr) {
    return !Array.isArray(arr) ? arr : [].concat.apply([], arr.map(flatten4));
}


flatten4([1,2,3,[1,2,3,[1,2]]])//[1, 2, 3, 1, 2, 3, 1, 2]

5. arr.flat()

//arr.flat()   会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。
 //Infinity 无穷大, -Infinity无穷小
function flatten5(arr){
    return  arr.flat(Infinity);
}

flatten5([1,2,3,[1,2,3,[1,2]]])//[1, 2, 3, 1, 2, 3, 1, 2]

6. JSON

function flatten6(arr){
    let str = JSON.stringify(arr);
    let str1 = str.replace(/\[|\]/g,'');
    let arr1 = str1.split(',');
    return arr1.map(item=>+item);//将被转成字符串的数字转换回去;
}

flatten6([1,2,3,[1,2,3,[1,2]]])//[1, 2, 3, 1, 2, 3, 1, 2]