数组拍平

2020-08-01  本文已影响0人  泡杯感冒灵

如果数组里只嵌套了一层数组

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]
上一篇 下一篇

猜你喜欢

热点阅读