美文网首页
数组拍平

数组拍平

作者: 泡杯感冒灵 | 来源:发表于2020-08-01 09:41 被阅读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]

相关文章

网友评论

      本文标题:数组拍平

      本文链接:https://www.haomeiwen.com/subject/lvmrrktx.html