JS数组扁平化的五种方法

172 阅读1分钟

有时候我们需要把多维数组拍平成一维数组,俗称“Javascript数组扁平化”。 这里提供JS数组扁平化的五种办法。

一、利用ES6的flat方法

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

二、用toString方法

用toString方法转换成字符串,再合成数组,此时数组每一项是字符串,用Number方法或者parseFloat把字符串转换成字符

let arr = [
    [1, 2, 2],
    [3, 4, 5, 5],
    [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10
]
arr = arr.toString().split(',').map(item => parseFloat(item))
console.log(arr)

三、用JSON.stringify方法

用JSON.stringify方法转换成字符串,此时字符串包含中括号,用正则表达式去除中括号字符,再合成数组,此时数组每一项是字符串,用Number方法或者parseFloat把字符串转换成字符

let arr = [
    [1, 2, 2],
    [3, 4, 5, 5],
    [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10
]
arr = JSON.stringify(arr).replace(/(\[|\])/g,'').split(',').map(item => parseFloat(item))
console.log(arr)

四、基于数组的some和Array.isArray方法进行判断检测

let arr = [
    [1, 2, 2],
    [3, 4, 5, 5],
    [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10
]
while(arr.some(item => Array.isArray(item))) {
    arr = [].concat(...arr)
}
console.log(arr)

五、递归深度遍历

如果发现不是数组,则放入新数组,如果是数组,则继续调用方法,直到里面的数字都被拿出来

Array.prototype.MyFlat = function () {
    let _this = this
    let result = []
    let fn = (arr) => {
        for (let i=0; i< arr.length; i++) {
            let item = arr[i]
            if (Array.isArray(item)) {
                fn(item)
            } else {
                result.push(item)
            }
        }
    }
    fn(_this)
    return result
}

console.log(arr.MyFlat())