最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 1w条数据,平铺数组转树形结构

    正文概述 掘金(MikiMiki)   2021-07-28   583

    后台丢来了1w条数据

    千算万算,还是没有逃过,后台真的就上万条数据一次丢给前端了。好吧,好在还不是10w条。如下,后台返回的是这样的结构:

    const flatArr = [
      { id: '001', name: '节点1' },
      { id: '0011', parentId: '001', name: '节点1-1' },
      { id: '00111', parentId: '0011', name: '节点1-1-1' },
      { id: '002', name: '节点2' },
    ]
    

    可以看到,这实际上就是一个平铺的数组,我们的需求是,要将这样数据渲染在Element-ui的级联选择器中,他接收的是如下的树形结构:

    let options = [
      {
        value: 'zhinan',
        label: '指南',
        children: [
          {
            value: 'shejiyuanze',
            label: '设计原则',
            children: [
              { value: 'yizhi', label: '一致' },
              { value: 'fankui', label: '反馈'}
            ],
          }
        ]
      }
    ]
    

    好家伙,这不就是需要我将平铺数组转成树形结构嘛!

    一顿操作猛如虎,二话不说写递归。

    递归方式

    1w条数据,平铺数组转树形结构

    大功告成,代码简洁,思路清晰,一运行,what?页面卡死了,console.time() 计算,大概使用了18s才计算出我们需要的树形结构。

    我反省了下我自己,这可是上万条数据,每次从下往上递归寻找父节点的子节点时都需要遍历一次数组,这当然耗时了!而且计算时长已经明显导致了页面卡顿,此法肯定是不可取的,那么,有没有更好的方案呢?

    非递归方式

    1w条数据,平铺数组转树形结构

    这里巧妙的应用了对象保存的是引用的特点,每次将当前节点的 id 作为 key,保存对应节点的引用信息,遍历数组时,每次更新 objMap 的 children 信息,这样 objMap中保留了所有节点极其子节点,最重要的是,我们只需要遍历一遍数组时间复杂度为O(n)。使用这种方式,计算时长只需要60ms!

    总结

    • 递归方式:每次递归寻找当前节点的子节点时都需要重新遍历一遍数组,时间复杂度为 O(nlogn)
    • 非递归方式:从根节点往下寻找子节点,通过 Map 保存每个节点及其子节点的信息,子节点保存的是 Map 上的引用,每个节点的子节点都可以在 Map 中通过 id 找到,时间复杂度为 O(n)

    我们来看一个对比图:

    1w条数据,平铺数组转树形结构

    通过上面时间复杂度随数据量增大的走势可以看出,当数据越来越大时,递归算法的耗时将远远大于非递归算法。因此,当数据量小时,使用递归算法有一定的优势,但是当数据大到一定的程度时,递归的做法的劣势将越来越明显,使用非递归算法会快很多!

    最后,不得不感慨一下,通过这个对比,我们也可以明显的感受到算法的重要性,不同的实现方式,差异可以很大,这值得引起每一个 developer 对算法的重视!


    起源地下载网 » 1w条数据,平铺数组转树形结构

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元