**將一個沒有層級的扁平對象,轉換為樹形結構**
* * * * *
~~~
let data = {
h3: {
parent: 'h2',
name: '經理(市場)'
},
h1: {
parent: 'h0',
name: '公司機構'
},
h7: {
parent: 'h6',
name: '經理(總務)'
},
h4: {
parent: 'h3',
name: '銷售'
},
h0: {
parent: '',
name: 'root'
},
h2: {
parent: 'h1',
name: '總經理'
},
h8: {
parent: 'h0',
name: '財務'
},
h6: {
parent: 'h4',
name: '倉管'
},
h5: {
parent: 'h4',
name: '代表'
}
}
~~~
轉換成如下數據結構:
~~~
let tree = {
'parent': '',
'name': 'root',
'h1': {
'parent': 'h0',
'name': '公司機構',
'h2': {
'parent': 'h1',
'name': '總經理',
'h3': {
'parent': 'h2',
'name': '經理(市場)',
'h4': {
'parent': 'h3',
'name': '銷售',
'h6': {
'parent': 'h4',
'name': '倉管',
'h7': {
'parent': 'h6',
'name': '經理(總務)'
}
},
'h5': {
'parent': 'h4',
'name': '代表'
}
}
}
}
},
'h8': { 'parent': 'h0', 'name': '財務' }
}
~~~
參照`trie`樹:
~~~
let obj2Tree = function (obj) {
let result = {}
for (let key in obj) {
// 保存每個循環對象
let parent = obj[key].parent
if (parent !== '') {
// 注意這里函數的參數obj是一個局部變量
// 保存的是傳參進來的那個值(指針),就是傳進來的值是指針
// 給指針修改屬性就等于操作引用類型一樣
// obj[key].name = 'zep' 會影響傳進來的那個對象
obj[parent][key] = obj[key]
// 如上操作等于操作局部變量obj
} else {
// 找到根節點, 將局部變量賦值給結果
// 很神奇, 利用了JavaScript里面的引用類型, 之后的思路, 和操作指針沒什么區別
result = obj[key]
}
}
return result
}
~~~