关于数组扁平化

作者: 青山旁小溪边 | 来源:发表于2019-11-20 20:12 被阅读0次

针对这样一个数组[3,[4,8,[9,1],3],[6,8],[2,10],5,7]想要将其展开,一般都会想到的是利用递归。
如下这样一个方法:


  function flatten(arr) {
    var newArr = [];
    arr.map(item => {
      if(Array.isArray(item)){
        newArr.push(...flatten(item))
      } else {
        newArr.push(item)
      }
    })
    return newArr
  }

但是这样的方法在数组嵌套非常深的情况下,函数递归调用时,调用层次太深,就会造成栈溢出。何为栈溢出?

栈是一种后进先出的数据结构,堆栈也是采用这种结构管理内存,调用过程中当最初的结果依赖于后面的计算处理,那么后面的部分虽然后开始处理,却先结束。当后续处理太多并且又依赖更后面的处理......(比如递归),便会一直压栈,当空间全部用完,就会造成“堆栈溢出”。
更通俗一点就是向一个水桶里装水,等装满了之后再加水就溢出了。

这时候就应该换一种方法来解决这个问题,调用数组的toString方法或者join方法,将数组变为字符串然后再用split分割还原为数组可以实现。

function flatten(arr) {
    return arr.toString().split(',').map(function(item) {
        return Number(item);
    })
} 
// 或者
function flatten(arr) {
    return arr.join(',').split(',').map(function(item) {
        return Number(item);
    })
}

但是该方法有一个缺点,就是会转换数组中元素item的类型,需要进行类型转换。
推荐使用es6的扩展运算符来实现数组扁平化。

  function flatten(arr) {
    let stack = [...arr].reverse()
    let newArr = []
    while(stack.length){
      let o = stack.pop()
      if(Array.isArray(o)){
        stack.push(...o.reverse())
      } else {
        newArr.push(o)
      }
    }
    return newArr
  }

相关文章

  • 5种方式实现数组扁平化

    5种方式实现数组扁平化 数组扁平化概念 数组扁平化是指将一个多维数组变为一维数组 实现 1. reduce 遍历数...

  • Array, Object扁平化

    1. 数组扁平化 数组扁平化就是将多维数组转化为一维数组: 1.1 toString + split 先将数组转化...

  • 『JavaScript专题』之数组扁平化

    JavaScript专题之数组扁平化 扁平化 数组的扁平化,就是将一个嵌套多层的数组 array (嵌套可以是任何...

  • 【重学】数组扁平化,乱序

    目录:数组扁平化数组乱序reduce()的妙用git复习:rebase,cherry-pick (1)数组扁平化 ...

  • 数组扁平化

    数组扁平化的概念 数组扁平化是指将一个多维数组变为一维数组 [1, [2, 3, [4, 5]]] ------...

  • 常用场景(持续更新ing)

    扁平化数组

  • 关于数组扁平化

    针对这样一个数组[3,[4,8,[9,1],3],[6,8],[2,10],5,7]想要将其展开,一般都会想到的是...

  • 前面面试题记录

    1.数组扁平化:答案 理解:数组扁平化可以利用apply(默认将数组展开)和扩展运算符(...) 如:[].con...

  • 5种方式实现数组扁平化

    数组扁平化概念 数组扁平化是指将一个多维数组变为一维数组 实现 1. reduce 遍历数组每一项,若值为数组则递...

  • 数组扁平化

    数组扁平化概念 数组扁平化是指将一个多维数组变为一维数组 实现 1. reduce 遍历数组每一项,若值为数组则递...

网友评论

    本文标题:关于数组扁平化

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