一 、通過雲開發平臺快速創建初始化應用 1.創建相關應用模版請參考鏈接: Hexo博客框架—輕量、一令部署 2.完成創建後就可以在github中查看到新增的Hexo倉庫 二 、 本地編寫《賽博朋克風格》個人博客 1.將應用模版克隆到本地 ● 首先假定你已經安裝了Git、node,沒有安裝請移步nod ...
問題描述
輸入一串父子節點對的數組,利用其構造一顆樹
輸入
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更為實用,故選擇之
-
每次只能處理一對父子關係,樹形結構的核心是節點,也即處理兩個節點。
由於每個節點的狀態是需要維護的,因此需要用一種結構存儲每個節點並更新之,最後程式只需要找到根節點是誰即可輸出完整的屬性結構;
解決代碼
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. 每次只能處理一對父子關係,樹形結構的核心是節點,也即處理兩個節點。
// 由於每個節點的狀態是需要維護的,因此需要用一種結構存儲每個節點並更新之,最後程式只需要找到根節點是誰即可輸出完整的屬性結構;
let nodeRigister = {}
let root = undefined
srcList.forEach(element => {
let childId = element.id
let parentId = element.parentid
// parentId可能引入新的信息:判斷是否為根節點。需要特判之
if(!parentId){
root = childId
}
// 處理兒子節點
if(!(childId in Object.keys(nodeRigister))){
nodeRigister[childId] = {id:childId,child:[]}
}
// 處理父節點
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)))