js多叉树的分析及实现
好了,终于回到了第一篇文章提到的组织结构的多叉树实现,有了前两篇文章的基础,多叉树的实现也就变得简单了
从后台拿到的原始数据形式为
const data =
[
{"orgId":1,"orgName":"总部","parentId":0},
{"orgId":6,"orgName":"工程部","parentId":1},
{"orgId":7,"orgName":"工程部1","parentId":6},
{"orgId":8,"orgName":"工程部2","parentId":7},
{"orgId":9,"orgName":"工程部3","parentId":8},
{"orgId":10,"orgName":"测试部","parentId":1},
{"orgId":11,"orgName":"测试部1","parentId":10},
{"orgId":12,"orgName":"测试部2","parentId":11},
{"orgId":13,"orgName":"生产部","parentId":1},
{"orgId":14,"orgName":"规划部","parentId":1},
{"orgId":15,"orgName":"市场部","parentId":1},
];
这是一个典型的多叉树结构,总部直接下级单位有工程部,测试部,生产部,规划部,市场部;其中工程部和测试部又有下级部门...
要求转换成的数据格式是
const json={
总部 : {
工程部 : {
工程部1 : {
工程部1 : {
},
},
},
测试部 : {
测试部1 : {
},
测试部2 : {
}
},
销售部 : {
销售部1 : {
},
销售部2 : {
}
},
售后部 : {
}
}
};
需要的数据形式为json嵌套对象,而且每个对象只保留属性名,所以分两步进行操作
1.利用原始数据生成组织机构列表树,利用递归判断id并生成多叉树
2.在第一步生成多叉树的过程中同时生成所需对象,使之符合需要的数据形式
代码如下
function MT(){
var OBJ={};
var CURRENT;
var TEM;
this.root=null;
this.Node=function(e){
this.orgId=e.orgId;
this.orgName=e.orgName;
this.parentId=e.parentId;
this.children=[];
}
this.insert=function(e){
CURRENT=OBJ;
function recursiveAdd(tem,e){
if(tem.orgId==e.parentId){
tem.children.push(e);
CURRENT=CURRENT[tem.orgName];
CURRENT[e.orgName]={};
}else{
for(var i=0;i<tem.children.length;i++){
if(tem.orgName==TEM.orgName){
CURRENT=OBJ;
}
CURRENT=CURRENT[tem.orgName];
recursiveAdd(tem.children[i],e);
}
}
}
if(e!=undefined){
e=new this.Node(e);
}else{
return;
}
if(this.root==null){
this.root=e;
OBJ[e.orgName]={};
}else{
TEM=this.root;
recursiveAdd(TEM,e);
}
console.log(OBJ);
}
}
需要注意的几点:
生成树结构首先找出根节点,并递归添加其他子节点
代码中的CURRENT=CURRENT[tem.orgName],CURRENT[e.orgName]={};用来生成嵌套对象,这里涉及数据类型的指向,请看以下示例代码
var Ele = {};
function nested(element){
element['key'] = {};
element = element['key'];
element['key1'] = {};
element = element['key1'];
}
nested(Ele);
console.log(Ele);
以上,给有需要的朋友,也为自己做一个记录^ ^
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。