数组扁平化的N种方法

176 阅读1分钟
let arr = [
    [1,2,2],
    [3,4,5,5],
    [6,7,8,9,[11,12,[12,13,[14]]]],
    10
]

一、flat (ES6新增)

arr = arr.flat(2)

参数含义是扁平化层数 ,结果:[ 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, [ 12, 13, [ 14 ] ], 10 ]

可以看到没有完全扁平化,当我们不知道有多少层使,可以使用Infinity作为参数

arr = arr.flat(Infinity)
// [1,  2,  2, 3,  4,  5,  5, 6,  7,  8, 9, 11, 12, 12, 13, 14, 10]

二、先转化为字符串

  1. 转普通字符串
arr = arr.toString().split(',').map(item => parseFloat(item))

数组转为字符串后,再转为逗号分隔的数组,此时数组内容为字符串类型,再转为数字类型。

  1. json字符串
arr = JSON.stringify(arr).replace(/(\[|\])/g,'').split(',').map(item => parseFloat(item))

先转为json字符串,利用正则把中括号过滤,剩余步骤同上

三、循环验证是否为数组

  1. while循环 + some 判断是否为数组,是就展开一级
while(arr.some(item => Array.isArray(item))){
    arr = [].concat(...arr)
}
  1. 递归
~function () {
        function myFlat() {
            let result = [], _this = this
            let fn = (arr) => {
                for (let i = 0; i < arr.length; i++) {
                    let item = arr[i]
                    if (Array.isArray(item)) {
                        fn(item)
                        continue
                    }
                    result.push(item)
                }
            }
            fn(_this)
            return result
        }
        Array.prototype.myFlat = myFlat
}()
arr = arr.myFlat()