不受控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 ]
// 完美