js 遞歸取到多層chilren中的數據 vue


處理后台返回的樹形結構數據
需求:只展示一級類目名,及下面所有標簽(同級展示)
data(){
        return{
             originData:[ //1.后台返回的數據結構
                {id:0,
                 categoryName:"類目1",
                 children:[
                            {Iid:0,labelName:"標簽名1"},
                            {Iid:1,labelName:"標簽名2"},
                          ]
                 },
                {id:1,
                 categoryName:"類目2",
                 children:[
                            {Iid:3,labelName:"標簽名3"},
                            {
                                children:[
                                    {Iid:4,labelName:"標簽名4"}
                                ]
                            },
                          ],
                
                },
                {id:2,
                 categoryName:"類目3",
                 children:[
                            {id:6,labelName:"標簽名5"},
                            {id:7,
                             children:[
                                 {Iid:5,labelName:"標簽名6"},
                                 {children:[
                                     {
                                         children:{Iid:6,labelName:"標簽名7"}
                                     }
                                 ]},
                             ]
                            },
                          ],
                
                },  
            ],
            // 2.想要的數據結構(頁面要展示需要的)
            wantData:[
                {
                    categoryName:'類目名1',
                    labelList:[{Iid:0,labelName:"標簽名1"},{Iid:1,labelName:"標簽名2"}]
                },
                {
                    categoryName:'類目名2',
                    labelList:[{Iid:2,labelName:"標簽名3"},{Iid:3,labelName:"標簽名4"}]
                },
                {
                    categoryName:'類目名3',
                    labelList:[{Iid:4,labelName:"標簽名5"},{Iid:5,labelName:"標簽名6"}]
                },
            ]

        }
    },
第一種方法:多層循環遍歷(局限:只能循環固定的層數)
 
        HandleLabelData(originData){
            let obj = {}
            let arr = []
            originData.forEach(item => {
                 obj={categoryName:"",labelList:[]}
                 obj.categoryName = item.categoryName
                 if(item.children.length){
                     item.children.forEach(item1=>{
                         if(!item1.children){
                             arr.push(item1)
                         }else{
                             item1.children.forEach(item2=>{
                                 if(!item2.children){
                                     arr.push(item2)
                                 }else{
                                     item2.children.forEach(item3=>{
                                         if(!item3.children){
                                             arr.push(item3)
                                         }else{
                                             arr = arr.concat(item3.children)  //只能循環3層
                                         }
                                     })
                                     
                                 }
                                 
                             })
                         }
                     })
                 }
                 obj.labelList = list
                 this.wantData.push(obj)
             }); 

        },
第二種方法:遞歸
 HandleLabelData(originData){
             let obj = {}
             originData.forEach(item => {
                 obj={categoryName:"",labelList:[]}
                 obj.categoryName = item.categoryName
                 this.diguiData(item,obj.labelList)
                 this.wantData.push(obj)
             });  
        },
diguiData(originItem,labelList){
            if(originItem.children&&originItem.children.length>0){
                originItem.children.forEach(item=>{
                    this.diguiData(item,labelList)
                })
  }
  delete originItem.children;
  labelList.push(originItem)
  }

image
image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM