JS实现数组扁平化

61 阅读1分钟

不受控flat函数:

Array.prototype.flat = function(){
    let array = this
    let result = []
    array.forEach(item => {
        if( item instanceof Array ) {
            result = result.concat(item.flat())
        } else {
            result.push(item)
        }
    })
    return result
}

思路很简单,遍历数组元素判断是否为Array,不是则push入结果数组中返回,如果是则递归调用flat,直到所有数组子元素都被拍平为止。

受控flat函数:

Array.prototype.controlFlat = function(deep) {
    if(deep === 0) return this
    let array = this
    let result = []
    array.forEach(item => {
        if( item instanceof Array ) {
            result = result.concat(item.controlFlat(deep-1))
        } else {
            result.push(item)
        }
    })
    return result
}

设置一个深度参数deep,表示要拍平到第几层,当deep为零时表示已经到了最大深度,则直接返回该元素(不论是否数组),其余思路与flat一致。

测试一下:

const arr = [1,2,3,[4,5,[6,7,[8],9],10],11]

console.log(arr.flat()) // [ 1, 2, 3, 4, 5, 6, 7, 8 , 9 , 10, 11 ]
console.log(arr.controlFlat(1) //[ 1, 2, 3, 4, 5, [ 6, 7, [ 8 ], 9 ], 10, 11 ]

// 完美