【笔记】多维数组降维

596 阅读1分钟

sourceData:

let baseArr = [1,2,[1,3],[['a','c'],[7],[[8]]],[9]]

1、递归

第一种

let newArr=[]
let getFlat = (arr) => {
    arr.foreach( element => {
        if(Array.isArray(element)){
            getFlat(elelment)
        }else{
            newArr.push(element)
        }
    })
}
getFlat(baseArr)

第二种

 function flatMap(arr) {
    for (let i = 0; i < arr.length; i++) {
        if (Array.isArray(arr[i])) {
            let tempArr = arr[i]
            arr.splice(i, 1, ...tempArr)
            i--
        }
    }
    return arr 
}

这种方法太秀了。

2、reduce函数

let getFlat = (arr) => {
    return arr.reduce( (pre,cur) => {
        if(Array.isArray(cur)){
            return pre.concat(...getFlat(cur))
        }else{
            return pre.concat(cur)
        }
    },[])
}
getFlat(baseArr)

需要设置初始值为[],不然concat会报错

3、flat方法

let newArr = baseArr.flat(Infinity)

flat 方法的参数为展开层数,infinity ,无限展开

引申一下: arr.flatMap(fn) ,这个方法接受一个回调函数。 flatMap 相当于是对数组先进行了map操作,再进行flat一维展开

4、字符串方法

let baseArr = [1,2,[1,3],[[5,6],[7],[[8]]],[9]]
let arr = baseArr+""  //"1,2,1,3,5,6,7,8,9"
arr = arr.split(',')  //["1", "2", "1", "3", "5", "6", "7", "8", "9"]
let newArr = arr.map(item=>{
    return eval(item)
})
console.log(newArr) // [1,2,1,3,5,6,7,8,9]

此方法,适用于多维数组是”纯值“。 如果,多维数组有非纯值内容,eval()方法会报错。 如果不用eval ()方法处理,得到的将会是一个字符串的数组,和原始数组会有一些偏差。

image.png