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

Javascript中扁平化數(shù)據(jù)結(jié)構(gòu)與JSON樹形結(jié)構(gòu)轉(zhuǎn)換詳解

 更新時(shí)間:2022年05月10日 16:40:24   作者:半城櫻花雨  
之前朋友問過我一個(gè)問題,項(xiàng)目中遇到扁平化數(shù)據(jù)結(jié)構(gòu)不知如何樹形化,下面這篇文章主要給大家介紹了關(guān)于Javascript中扁平化數(shù)據(jù)結(jié)構(gòu)與JSON樹形結(jié)構(gòu)轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下

不廢話,直接開干

一. 先說簡(jiǎn)單的樹形結(jié)構(gòu)數(shù)扁平化處理

上思想: 思想:采用遞歸,每個(gè)對(duì)象都有childern,只要有children屬性提取出來將其放在空數(shù)組中 然后將對(duì)象的其他屬性解構(gòu)出來,最后將數(shù)組合并

上代碼:

//已知JSON樹狀形結(jié)構(gòu)的數(shù)據(jù)data
let data = [
             {id:1,title:'標(biāo)題1',parent_id:0,},
             {id:2,title:'標(biāo)題2',parent_id:0,
              children:[
                 {id:3,title:'標(biāo)題2-1',parent_id:2,
                  children:[
                    {id:4,title:'標(biāo)題3-1',parent_id:3,
                     children:[
                        {id:5,title:'標(biāo)題4-1',parent_id:4}
                      ]}
                  ]},
                {id:6,title:'標(biāo)題2-2',parent_id:2}
              ]
            }
           ],
           
   function flat(data){
            return data.reduce((pre,cur)=>{
                // console.log(cur);
                //此處將對(duì)象的children屬性和值都解構(gòu)在空數(shù)組中,將對(duì)象的其他屬性和值都解構(gòu)在i里面。
                const {children=[],...i}=cur;   // 注意 ...i 只能寫在解構(gòu)賦值的末尾,否則報(bào)錯(cuò)
                // console.log(i);
                // // console.log(children);
                return pre.concat([{...i}],flat(children))  //利用遞歸回調(diào),數(shù)組合并,注意此處 {...i}是解構(gòu)
            },[]);
        }
   console.log(flat(data)); 

這里用到了 es6解構(gòu)賦值 和不常用的 Array.reduce,文章講的不錯(cuò),可以去看看。

二. 再講將扁平化數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)JSON樹狀形結(jié)構(gòu)

思想都在步驟里了。

老規(guī)矩上代碼:

  //已知扁平化數(shù)據(jù)Arr
let Arr = [
            {id:1,title:'標(biāo)題1',parent_id:0},
            {id:2,title:'標(biāo)題2',parent_id:0},
            {id:3,title:'標(biāo)題2-1',parent_id:2},
            {id:4,title:'標(biāo)題3-1',parent_id:3},
            {id:5,title:'標(biāo)題4-1',parent_id:4},
            {id:6,title:'標(biāo)題2-2',parent_id:2},
          ];

     const result = []
     function fn(list){
          const remap = list.reduce((pre,cur)=>{  //###第一步:將數(shù)組轉(zhuǎn)換成鍵值對(duì)的形式(鍵是id值,值是對(duì)象)
                // console.log(cur);
               pre[cur.id]=cur
                // console.log(pre);
               return pre
           },{})
                //console.log(remap);
               //###第二步,循環(huán)遍歷數(shù)組,判斷是不是(樹狀結(jié)構(gòu)最外層,祖宗層數(shù)據(jù))第一層的數(shù)據(jù)(本處就是parent_id等不等于0)
            for(let item of list){  //用普通的for循環(huán)也行,但是用for in 不行,只能獲取數(shù)組的元素下標(biāo),或者對(duì)象的鍵
                console.log(item);
                if(item.parent_id===0){
                    result.push(item)
                    continue
                }
                // console.log(item.parent_id);
                // console.log(remap[item.parent_id]); //注意 obj[key] 就代表是對(duì)象的值value
                if(item.parent_id in remap) {   //換成else也可,目的將不是第一層的數(shù)據(jù)(parent_id不等于0)挑出來,并賦予一個(gè)children屬性
                    const parent = remap[item.parent_id];
                    parent.children = parent.children || []; 
                    // console.log(parent);
                    parent.children.push(item);
                    //console.log(parent);
                }
            }
            // console.log(result);
            return result
        }
      console.log(fn(Arr));

擴(kuò)充一個(gè)知識(shí)點(diǎn):for in 與 for of 的區(qū)別 :

for-in結(jié)構(gòu)對(duì) Array(數(shù)組)和Object(對(duì)象)都可以使用,但只能拿到數(shù)組元素下標(biāo)或者對(duì)象的鍵;

而for-of結(jié)構(gòu)在對(duì)Object(對(duì)象)使用時(shí)會(huì)報(bào)錯(cuò),在數(shù)組是可以拿到數(shù)組元素。

const arr = [2,3,4]
const obj = {
    a:2,
    b:3,
    c:4
},

for (let item in arr){
    console.log(item);  // 0 , 1 , 2
}

for (let item of arr){
    console.log(item);  // 2 , 3 , 4
}

for (let item in obj){
    console.log(item)  // a ,b ,c
}

for (let item of obj ){
    console.log(item)  // Uncaught TypeError: arr is not iterable 
}

總結(jié)

到此這篇關(guān)于Javascript中扁平化數(shù)據(jù)結(jié)構(gòu)與JSON樹形結(jié)構(gòu)轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)js扁平化與JSON樹形結(jié)構(gòu)轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用webpack和rollup打包組件庫(kù)的方法

    使用webpack和rollup打包組件庫(kù)的方法

    這篇文章主要介紹了使用webpack和rollup打包組件庫(kù)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Stop SQL Server

    Stop SQL Server

    Stop SQL Server...
    2007-06-06
  • firefox下javascript實(shí)現(xiàn)高亮關(guān)鍵詞的方法

    firefox下javascript實(shí)現(xiàn)高亮關(guān)鍵詞的方法

    “點(diǎn)睛”的廣告代碼,很牛B,本想從中找出在FireFox下如何實(shí)現(xiàn)findText及pasteHTML類似效果的,我看了大半天,楞是沒有看出個(gè)所以然來!還是自己慢慢研究吧。
    2007-07-07
  • js實(shí)現(xiàn)圖片查看器

    js實(shí)現(xiàn)圖片查看器

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)圖片查看器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 全面解析Bootstrap排版使用方法(標(biāo)題)

    全面解析Bootstrap排版使用方法(標(biāo)題)

    這篇文章全面解析了Bootstrap排版使用方法,本文重點(diǎn)介紹Bootstrap標(biāo)題排版,感興趣的小伙伴們可以參考一下
    2015-11-11
  • JS實(shí)現(xiàn)給對(duì)象動(dòng)態(tài)添加屬性的方法

    JS實(shí)現(xiàn)給對(duì)象動(dòng)態(tài)添加屬性的方法

    這篇文章主要介紹了JS實(shí)現(xiàn)給對(duì)象動(dòng)態(tài)添加屬性的方法,涉及JS屬性的遍歷、動(dòng)態(tài)賦值及eval方法的簡(jiǎn)單使用技巧,需要的朋友可以參考下
    2017-01-01
  • ECharts柱狀排名圖柱子上方顯示文字與圖標(biāo)代碼實(shí)例

    ECharts柱狀排名圖柱子上方顯示文字與圖標(biāo)代碼實(shí)例

    我們?cè)诶L制柱狀圖時(shí)如果想要柱條上顯示文字,可以參考本文,這篇文章主要給大家介紹了關(guān)于ECharts柱狀排名圖柱子上方顯示文字與圖標(biāo)的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • JavaScript如何在不重新加載頁(yè)面的情況下修改URL

    JavaScript如何在不重新加載頁(yè)面的情況下修改URL

    在現(xiàn)代Web應(yīng)用中,單頁(yè)面應(yīng)用(SPA)越來越流行,為了提升用戶體驗(yàn),我們經(jīng)常需要在不重新加載頁(yè)面的情況下修改URL,本文將詳細(xì)介紹如何在不重新加載頁(yè)面的情況下修改URL,并通過多個(gè)示例展示其應(yīng)用場(chǎng)景,需要的朋友可以參考下
    2024-11-11
  • 微信小程序中轉(zhuǎn)義字符的處理方法

    微信小程序中轉(zhuǎn)義字符的處理方法

    這篇文章主要介紹了微信小程序中轉(zhuǎn)義字符的處理方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 微信小程序?qū)崿F(xiàn)左滑修改、刪除功能

    微信小程序?qū)崿F(xiàn)左滑修改、刪除功能

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)左滑修改、刪除功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10

最新評(píng)論

通城县| 灵川县| 定安县| 临桂县| 高青县| 留坝县| 京山县| 武义县| 盖州市| 个旧市| 宿州市| 景洪市| 廊坊市| 长沙县| 兖州市| 海林市| 合水县| 正定县| 瑞金市| 沙坪坝区| 晴隆县| 饶河县| 北碚区| 肇源县| 和平区| 北安市| 临湘市| 固镇县| 长沙市| 西丰县| 大石桥市| 玛纳斯县| 永康市| 临沧市| 镇雄县| 郸城县| 安阳县| 左云县| 伊宁县| 鄂州市| 常山县|