**将一个没有层级的扁平对象,转换为树形结构**
* * * * *
~~~
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
}
~~~