輸入一串父子節(jié)點對的數(shù)組,利用其構(gòu)造一顆樹
在義安等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站制作、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站制作,全網(wǎng)整合營銷推廣,成都外貿(mào)網(wǎng)站建設(shè)公司,義安網(wǎng)站建設(shè)費用合理。
const arr = [
{id:1,parentid:null},
{id:2,parentid:1},
{id:3,parentid:1},
{id:4,parentid:2},
{id:5,parentid:3}
]
明確輸出的形式:
type1: {id:0,chid:[{id,child},{id,child},{id,child}]}
type2: 0:{1:{5:{}},2:{},3:{},4:{}}
實踐中type1更為實用,故選擇之
每次只能處理一對父子關(guān)系,樹形結(jié)構(gòu)的核心是節(jié)點,也即處理兩個節(jié)點。
由于每個節(jié)點的狀態(tài)是需要維護(hù)的,因此需要用一種結(jié)構(gòu)存儲每個節(jié)點并更新之,最后程序只需要找到根節(jié)點是誰即可輸出完整的屬性結(jié)構(gòu);
const arr = [
{id:1,parentid:null},
{id:2,parentid:1},
{id:3,parentid:1},
{id:4,parentid:2},
{id:5,parentid:3}
]
function generateTree(srcList){
// 1. 明確輸出的形式:
// type1:{id:0,chid:[{id,child},{id,child},{id,child}]}
// type2: 0:{1:{5:{}},2:{},3:{},4:{}}
// 實踐中type1更為實用,故選擇之
// 2. 每次只能處理一對父子關(guān)系,樹形結(jié)構(gòu)的核心是節(jié)點,也即處理兩個節(jié)點。
// 由于每個節(jié)點的狀態(tài)是需要維護(hù)的,因此需要用一種結(jié)構(gòu)存儲每個節(jié)點并更新之,最后程序只需要找到根節(jié)點是誰即可輸出完整的屬性結(jié)構(gòu);
let nodeRigister = {}
let root = undefined
srcList.forEach(element => {
let childId = element.id
let parentId = element.parentid
// parentId可能引入新的信息:判斷是否為根節(jié)點。需要特判之
if(!parentId){
root = childId
}
// 處理兒子節(jié)點
if(!(childId in Object.keys(nodeRigister))){
nodeRigister[childId] = {id:childId,child:[]}
}
// 處理父節(jié)點
if(parentId && parentId in Object.keys(nodeRigister)){
nodeRigister[parentId].child.push(nodeRigister[childId])
}else if(parentId){
nodeRigister[parentId] = {id:parentId,child:[nodeRigister[childId]]}
}
});
return nodeRigister[root]
}
console.log(JSON.stringify(generateTree(arr)))