如果数组里只嵌套了一层数组
const arr = [1, 2, [3, 4], 5]
const resArr1 = Array.prototype.concat.apply([], arr)
console.log(resArr1) // [1, 2, 3, 4, 5]
const resArr2 = Array.prototype.concat.call([], 1, 2, [3, 4], 5)
console.log(resArr2) // [1, 2, 3, 4, 5]
const resArr3 = [].concat(1, 2, [3, 4], 5)
console.log(resArr3) // [1, 2, 3, 4, 5]
const resArr4 = [].concat(arr)
console.log(resArr4) // [1, 2, Array(2), 5]
const resArr5 = [].concat(1, 2, [3, 4,[6,7]], 5)
console.log(resArr5) // [1, 2, 3, 4, Array(2), 5]
经过测试,我们发现,如果concat的参数,只有一层数组,是可以直接拍平的。如果有两层,或两层以上的数组,是不会拍平的,这个时候,就要用到递归
function flat(arr) {
// 验证 arr中,还有没有深层数组
// some方法,用于检测数组中的元素是否满足指定条件,只要有一个满足,就会返回true,否则返回false
const isDeep = arr.some(item => item instanceof Array)
if (!isDeep) {
return arr // 如果传入的就是平的数组,就直接返回 如 [1,2,3,4,5]
}
// 如果不是平的,而是深层次的 如[1, 2, [3, 4], 5], 那就第一次拍平
const res = Array.prototype.concat.apply([], arr)
// 第一次拍平后,对结果进行递归。又回到了上边的逻辑,如果已经是平的就返回,如果不是就再次拍平
// 一直到完全拍平
return flat(res)
}
const res = flat([1, 2, [3, 4,[6,7,[8,[9]]]], 5])
console.log(res) // [1, 2, 3, 4, 6, 7, 8, 9, 5]
网友评论