1

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);
  }

}

需要注意的几点:

  1. 生成树结构首先找出根节点,并递归添加其他子节点

  2. 代码中的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);

以上,给有需要的朋友,也为自己做一个记录^ ^


zorroyz
25 声望7 粉丝