欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript數(shù)組扁平轉(zhuǎn)樹(shù)形結(jié)構(gòu)數(shù)據(jù)(Tree)的實(shí)現(xiàn)

 更新時(shí)間:2022年08月05日 10:04:41   作者:一只豆豆  
本文主要介紹了JavaScript數(shù)組扁平轉(zhuǎn)樹(shù)形結(jié)構(gòu)數(shù)據(jù)(Tree)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

之前面試有遇到過(guò)這個(gè)問(wèn)題,面試官問(wèn):如何把一個(gè)數(shù)組數(shù)據(jù)扁平,然后轉(zhuǎn)化為Tree結(jié)構(gòu)數(shù)據(jù),工作中剛好也用到了,在這里總結(jié)一下。

需求大致如下

把這個(gè)數(shù)組轉(zhuǎn)為樹(shù)形結(jié)構(gòu)數(shù)據(jù)(Tree)

    const flatArr = [
        { id: '01', parentId: 0, name: '節(jié)點(diǎn)1' },
        { id: '011', parentId: '01', name: '節(jié)點(diǎn)1-1' },
        { id: '0111', parentId: '011', name: '節(jié)點(diǎn)1-1-1' },
        { id: '02', parentId: 0, name: '節(jié)點(diǎn)2' },
        { id: '022', parentId: '02', name: '節(jié)點(diǎn)2-2' },
        { id: '023', parentId: '02', name: '節(jié)點(diǎn)2-3' },
        { id: '0222', parentId: '022', name: '節(jié)點(diǎn)2-2-2' },
        { id: '03', parentId: 0, name: '節(jié)點(diǎn)3' },
      ]

最終結(jié)果

    [
        {
          id: '01',
          name: '節(jié)點(diǎn)1',
          parentId: 0,
          children: [
            {
              id: '011',
              name: '節(jié)點(diǎn)1-1',
              parentId: '01',
              children: [
                {
                  id: '0111',
                  name: '節(jié)點(diǎn)1-1-1',
                  parentId: '011',
                  children: [
                      ...
                  ],
                },
              ],
            },
          ],
        },
        {
          id: '02',
          name: '節(jié)點(diǎn)2',
          parentId: 0,
          children: [
              // 如上節(jié)點(diǎn)1
          ]
        },
        {
          id: '03',
          name: '節(jié)點(diǎn)3',
          parentId: 0,
          children: [
              // 如上節(jié)點(diǎn)1
          ]
        }
      ]

遞歸方式

遞歸方式實(shí)現(xiàn)是OK的,但是數(shù)據(jù)多的話會(huì)稍微慢一點(diǎn)哈

    const flatArr = [
        { id: '01', parentId: 0, name: '節(jié)點(diǎn)1' },
        { id: '011', parentId: '01', name: '節(jié)點(diǎn)1-1' },
        { id: '0111', parentId: '011', name: '節(jié)點(diǎn)1-1-1' },
        { id: '02', parentId: 0, name: '節(jié)點(diǎn)2' },
        { id: '022', parentId: '02', name: '節(jié)點(diǎn)2-2' },
        { id: '023', parentId: '02', name: '節(jié)點(diǎn)2-3' },
        { id: '0222', parentId: '022', name: '節(jié)點(diǎn)2-2-2' },
        { id: '03', parentId: 0, name: '節(jié)點(diǎn)3' },
      ]
      
    function getTreeData (arr, parentId) {
        function loop (parentId) {
          return arr.reduce((pre, cur) => {
            if (cur.parentId === parentId) {
              cur.children = loop(cur.id)
              pre.push(cur)
            }
            
            return pre
          }, [])
        }
        return loop(parentId)
      }

      const result = getTreeData(flatArr, 0)
      console.log('result', result)

打印結(jié)果如圖

非遞歸方式

這種方法看起來(lái)就很簡(jiǎn)單代碼也很簡(jiǎn)潔

    const flatArr = [
        { id: '01', parentId: 0, name: '節(jié)點(diǎn)1' },
        { id: '011', parentId: '01', name: '節(jié)點(diǎn)1-1' },
        { id: '0111', parentId: '011', name: '節(jié)點(diǎn)1-1-1' },
        { id: '02', parentId: 0, name: '節(jié)點(diǎn)2' },
        { id: '022', parentId: '02', name: '節(jié)點(diǎn)2-2' },
        { id: '023', parentId: '02', name: '節(jié)點(diǎn)2-3' },
        { id: '0222', parentId: '022', name: '節(jié)點(diǎn)2-2-2' },
        { id: '03', parentId: 0, name: '節(jié)點(diǎn)3' },
     ]
      
    function getData (arr) {
        // 利用兩層filter實(shí)現(xiàn)
        let data = arr.filter(item => {
          item.children = arr.filter(e => {
            return item.id === e.parentId
          })
          return !item.parentId
        })

        return data
      }
      const res = getData(flatArr)
      console.log('res', res)

打印結(jié)果如圖

小結(jié)

實(shí)現(xiàn)的方法很多,選擇自己喜歡的就好,到此這篇關(guān)于JavaScript數(shù)組扁平轉(zhuǎn)樹(shù)形結(jié)構(gòu)數(shù)據(jù)(Tree)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)JavaScript數(shù)組扁平轉(zhuǎn)樹(shù)形結(jié)構(gòu) 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論