数组扁平化的六种方法

37 阅读1分钟

const arr = [1,2,3,4,5,[4,5,4,[6]],[7]];

方法一:for of遍历

function flatten1(arr){
    const result = [];
    for (const arrElement of arr) {
        if(Array.isArray(arrElement)){
            result.push(...flatten1(arrElement));
        }else{
            result.push(arrElement);
        }
    }
    return result
}

console.log(flatten1(arr))

方法二:reduce

function flatten2(arr){
    return arr.reduce((pre,cur,index)=>{
        return pre.concat((Array.isArray(cur)?flatten2(cur):cur))
    },[])
}
// console.log(flatten2(arr))
// console.log([1,2,3,4].concat(1,2,3,4,))
// console.log([1,2,3,4].concat(1,[1,2,3,4],7))
  1. concat可连接单个、多个元素、数组或这几种的组合
  2. push方法会返回push后的length

方法三:扩展运算符 + Array.some

function flatten3(arr){
    while(arr.some(item=>Array.isArray(item))){
        arr = [].concat(...arr); // ...arr 点语法已经将扁平化了一层
    }
    return arr
}
// console.log(flatten3(arr))
  1. while 通过判断数组中是否存在嵌套数组,存在则解开
  2. …arr 将arr数组解开成1,2,3,4,[2,3,4],4,[5]的方式,即从外向内扁平化一层
  3. 该方法会直接作用于原始数组

方法四:toString + split

function flatten4(arr){
    return arr.toString().split(',').map(item=>+item)

}
// console.log(flatten4(arr))

toString 方法是Object对象的方法,其他都是基于原型链继承的,所以都会直接将所有形式的参数转换成以逗号分割的字符串。也就是说对于嵌套数组会直接全部展开以逗号连接


方法五:JSON.stringify + RegExp

function flatten5(arr){
    // const str = JSON.stringify(arr).replace(/([|])/g,"").split(',').map(item=>+item)
    return JSON.parse('['+JSON.stringify(arr).replace(/([|])/g,"")+']')
}
// console.log(flatten5(arr))
// console.log(Array.isArray(flatten5(arr)))

将数组序列化,然后使用正则匹配字符串中的 [ 和 ] ,将其变成空即可,然后反序列化回来


方法六:Array.flat

function flatten6(arr){
    return arr.flat(Infinity)
}
console.log(flatten6(arr))
console.log(Array.isArray(flatten6(arr)))

使用Array.flat原生方法,使用参数Infinity表示扁平层数为无穷,即扁平到没有嵌套数组即可

参考 juejin.cn/post/699887…