ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
**将一个没有层级的扁平对象,转换为树形结构** * * * * * ~~~ 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 } ~~~