php 递归生成树,js递归生成树结构

c8223a9fec406a2853872cc2947b082d.png做前端的经常会遇到要将数组转化成树状结构,这个写起来比较容易出错,故在此将代码奉上,减少开发时间

 
 

节点1

节点2

节点3

节点4

节点5

节点6

var data=[{nodeId:1,label:'节点1'},{nodeId:2,label:'节点2',parentId:1},{nodeId:3,label:'节点3',parentId:1},{nodeId:4,label:'节点4',parentId:3},{nodeId:5,label:'节点5'},{nodeId:6,label:'节点6',parentId:5},];

function getTree(treeData){

if(treeData==undefined||treeData.length==0)

return;

var firstMenus=[];

var leftMenus=[];//剩余未处理的

var dealData=deepCopy(treeData);

for(var i in dealData){

if(dealData[i].parentId==undefined||dealData[i].parentId==''){

firstMenus.push(dealData[i]);

}else{

leftMenus.push(dealData[i]);

}

}

buildMenuTree(firstMenus,leftMenus);

return firstMenus;

}

function buildMenuTree(firstMenus, leftMenus) {

var deleteNode={};//待删除节点

for (var i in firstMenus) {

for (var j in leftMenus) {

if (firstMenus[i].nodeId === leftMenus[j].parentId) {

if (firstMenus[i].children == undefined) {

firstMenus[i].children = [leftMenus[j]];

} else {

firstMenus[i].children.push(leftMenus[j]);

}

deleteNode[leftMenus[j].nodeId]='';

}

}

}

//删除已经处理的

for(var i in leftMenus){

if(deleteNode[leftMenus[i].nodeId]){

leftMenus.splice(i, 1);//移除已处理的元素

}

}

//处理children的层级,剩余未处理的

for (var k in firstMenus) {

if (firstMenus[k].children != undefined && firstMenus[k].children.length > 0) {

buildMenuTree(firstMenus[k].children, leftMenus);

}

}

}

//深拷贝,注意简单的slice是无法真正的进行深拷贝的,children属性无法去除,多次执行getTree方法就可出现bug

function deepCopy(ary){

return JSON.parse(JSON.stringify(ary));

}

console.log(getTree(data));

控制台输出

84a92739ef646250993164ccd89238b8.png

907193fcbe7378f47a7661ebed78510f.png

2a11121594f5bae791691a9bec83b92b.png

本文仅代表作者个人观点,不代表SEO研究协会网官方发声,对观点有疑义请先联系作者本人进行修改,若内容非法请联系平台管理员,邮箱cxb5918@163.com。更多相关资讯,请到SEO研究协会网www.seoxiehui.cn学习互联网营销技术请到巨推学院www.jutuiedu.com。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值