var arr = [1,2,{a: 1, b: 2}, 5, [{}, [99, {g: 111}, [{}, {c: 12}]], 1, 'abc', Symbol('aaa')], null, undefined, true, [true, false, 21, [123], 4]] => [1,2,{a: 1, b: 2}, 5, {}, 99 ...]
这就是数组的扁平化。


var arr = [
    1, 2, 3, [
        {
            a: 12,
            c: 1
        },
        true,
        false,
        Symbol('a')
    ],
    10,
    [
        10,
        {
            name: 'vey',
            age: 12,
            sex: 'male'
        },
        false,
        [
            999,
            false,
            {
                p: 'this is a paragraph'
            }
        ]
    ]
]


function flatten(arr) {
    var arr = arr || [],
        res = [],
        len = arr.length
    for (var i = 0; i < len ; i ++){
        if(isArray(arr[i])){
            res = res.concat(flatten(arr[i]))
        }else {
            res.push(arr[i])
        }
    }
    return res
}

function isArray(obj) {
    return Object.prototype.toString.call(obj) === '[object Array]'
}
console.log(flatten(arr));

唯一的缺点是不够优雅。

Array.prototype.flatten = function () {
    var res = []
    this.forEach(function (item) {
        Object.prototype.toString.call(item) === '[object Array]' ? res = res.concat(item.flatten()) : res.push(item)
    })
    return res
}
console.log(arr.flatten())

这样便会好很多.
reduce 方法实现

function flatten(arr) {
    arr = arr || []
    return arr.reduce(function (prev, next) {
        return Object.prototype.toString.call(next) === '[object Array]' ? prev.concat(flatten(next)) : prev.concat(next)
    }, [])
}

ES6

const flatten = arr => arr.reduce((prev, next) => {
  return Object.prototype.toString.call(next) === '[object Array]' ? 
  prev.concat(flatten(next)) : prev.concat(next)},
[])

... 简书一行实在是看不了...