xiaohai Blog

Javascript 拍平数组的 N 种方法

July 08, 2017

flatten one level

方法一 利用 for 循环处理

var flatten = function(array) {
    var res = []
    for (var i = 0; i < array.length; i++) {
        var a = array[i]
        if (Array.isArray(a)) {
            for (var j = 0; j < a.length; j++) {
                var b = a[j]
                res.push(b)
            }
        } else {
            res.push(a)
        }
    }
    return res
}

flatten([1, [2, [3, [4]], 5]]) // => [1, 2, [3, [4]], 5]

方法二 利用数组的 reduce 方法

var flatten = function(array) {
    var res = array.reduce(function(a, b) {
        return a.concat(b)
    }, [])
    return res
}

flatten([1, [2, [3, [4]], 5]]) // => [1, 2, [3, [4]], 5]

方法三 用 ES6 改写方法二

const flatten = list => list.reduce(
    (a, b) => a.concat(b), []
)

flatten([1, [2, [3, [4]], 5]]) // => [1, 2, [3, [4]], 5]

方法四 利用 ES6 的扩展符号 ... 方法

var flatten = function(array) {
    return Array.prototype.concat(...array)
}

flatten([1, [2, [3, [4]], 5]]) // => [1, 2, [3, [4]], 5]

flatten deep

递归调用方法三

const flatten_deep = list => list.reduce(
    (a, b) => a.concat(Array.isArray(b) ? flatten_deep(b) : b), []
)

flatten_deep([1, [2, [3, [4]], 5]]) // => [1, 2, 3, 4, 5]