最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

需求大致如下

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

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

最終結(jié)果

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

遞歸方式

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

    const flatArr = [
        { id: '01', parentId: 0, name: '節(jié)點1' },
        { id: '011', parentId: '01', name: '節(jié)點1-1' },
        { id: '0111', parentId: '011', name: '節(jié)點1-1-1' },
        { id: '02', parentId: 0, name: '節(jié)點2' },
        { id: '022', parentId: '02', name: '節(jié)點2-2' },
        { id: '023', parentId: '02', name: '節(jié)點2-3' },
        { id: '0222', parentId: '022', name: '節(jié)點2-2-2' },
        { id: '03', parentId: 0, name: '節(jié)點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é)果如圖

非遞歸方式

這種方法看起來就很簡單代碼也很簡潔

    const flatArr = [
        { id: '01', parentId: 0, name: '節(jié)點1' },
        { id: '011', parentId: '01', name: '節(jié)點1-1' },
        { id: '0111', parentId: '011', name: '節(jié)點1-1-1' },
        { id: '02', parentId: 0, name: '節(jié)點2' },
        { id: '022', parentId: '02', name: '節(jié)點2-2' },
        { id: '023', parentId: '02', name: '節(jié)點2-3' },
        { id: '0222', parentId: '022', name: '節(jié)點2-2-2' },
        { id: '03', parentId: 0, name: '節(jié)點3' },
     ]
      
    function getData (arr) {
        // 利用兩層filter實現(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é)

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

相關(guān)文章

  • Array.prototype 的泛型應(yīng)用分析

    Array.prototype 的泛型應(yīng)用分析

    Array.prototype 的泛型應(yīng)用分析,需要的朋友可以參考下。
    2010-04-04
  • JS實現(xiàn)左右拖動改變內(nèi)容顯示區(qū)域大小的方法

    JS實現(xiàn)左右拖動改變內(nèi)容顯示區(qū)域大小的方法

    這篇文章主要介紹了JS實現(xiàn)左右拖動改變內(nèi)容顯示區(qū)域大小的方法,涉及JavaScript實時響應(yīng)鼠標事件動態(tài)改變頁面元素屬性的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • js全屏顯示顯示代碼的三種方法

    js全屏顯示顯示代碼的三種方法

    這篇文章介紹了js全屏顯示顯示代碼的三種方法,有需要的朋友可以參考一下
    2013-11-11
  • 簡單實現(xiàn)js拖拽效果

    簡單實現(xiàn)js拖拽效果

    這篇文章主要教大家如何簡單實現(xiàn)js拖拽效果,很詳細的js拖拽效果實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Three.js利用性能插件stats實現(xiàn)性能監(jiān)聽的方法

    Three.js利用性能插件stats實現(xiàn)性能監(jiān)聽的方法

    Three.js 是一款運行在瀏覽器中的 3D 引擎,你可以用它創(chuàng)建各種三維場景,而下面這篇文章主要給大家介紹了關(guān)于Three.js如何利用性能插件stats實現(xiàn)性能監(jiān)聽的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起學習學習吧。
    2017-09-09
  • Validform表單驗證總結(jié)篇

    Validform表單驗證總結(jié)篇

    這篇文章主要介紹了Validform表單驗證,包括通用表單驗證方法的知識,本文給大家介紹的非常詳細具有參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • 微信小程序使用this.setData()遇到的問題及解決方案詳解

    微信小程序使用this.setData()遇到的問題及解決方案詳解

    this.setData估計是小程序中最經(jīng)常用到的一個方法,但是要注意其實他是有限制的,忽略這些限制的話,會導(dǎo)致數(shù)據(jù)無法更新,下面這篇文章主要給大家介紹了關(guān)于微信小程序使用this.setData()遇到的問題及解決方案,需要的朋友可以參考下
    2022-08-08
  • 教你一步步實現(xiàn)一個簡易promise

    教你一步步實現(xiàn)一個簡易promise

    Promise是異步編程的一種解決方案,比傳統(tǒng)的解決方案回調(diào)函數(shù)和事件更合理且更強大,這篇文章主要給大家介紹了關(guān)于如何一步步實現(xiàn)一個簡易promise的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • JavaScript日期工具類DateUtils定義與用法示例

    JavaScript日期工具類DateUtils定義與用法示例

    這篇文章主要介紹了JavaScript日期工具類DateUtils定義與用法,涉及javascript針對日期時間的獲取、轉(zhuǎn)換、比較、運算等相關(guān)操作技巧,需要的朋友可以參考下
    2018-09-09
  • js創(chuàng)建對象的方法匯總

    js創(chuàng)建對象的方法匯總

    這篇文章主要介紹了js創(chuàng)建對象的方法,js一個有三種方法創(chuàng)建對象,這里為大家做一個總結(jié),感興趣的小伙伴們可以參考一下
    2016-01-01

最新評論

无极县| 科尔| 肇州县| 阜平县| 碌曲县| 荔波县| 永登县| 平原县| 延安市| 娄烦县| 苗栗县| 南城县| 乐安县| 兴文县| 塔城市| 体育| 若羌县| 香格里拉县| 抚远县| 郴州市| 东港市| 龙州县| 壶关县| 通江县| 临猗县| 连云港市| 德江县| 炉霍县| 泰来县| 招远市| 宁海县| 连云港市| 永吉县| 丹棱县| 马关县| 呼伦贝尔市| 红河县| 甘肃省| 玛多县| 东阳市| 桑植县|