美文网首页
数组拍平

数组拍平

作者: 泡杯感冒灵 | 来源:发表于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