热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

java、js中实现无限层级的树形结构方法(类似递归)

下面小编就为大家带来一篇java、js中实现无限层级的树形结构方法(类似递归)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

js中:

var zNodes=[
{id:0,pId:-1,name:"Aaaa"},
  {id:1,pId:0,name:"A"},
  {id:11,pId:1,name:"A1"},
  {id:12,pId:1,name:"A2"},
  {id:13,pId:1,name:"A3"},
  {id:2,pId:0,name:"B"},
  {id:21,pId:2,name:"B1"},
  {id:22,pId:2,name:"B2"},
  {id:23,pId:2,name:"B3"},
  {id:3,pId:0,name:"C"},
  {id:31,pId:3,name:"C1"},
  {id:32,pId:3,name:"C2"},
  {id:33,pId:3,name:"C3"},
  {id:34,pId:31,name:"x"},
  {id:35,pId:31,name:"y"}, 
  {id:36,pId:31,name:"z"},
  {id:37,pId:36,name:"z1123"} ,
  {id:38,pId:37,name:"z123123123"}  
];
function treeMenu(a){
  this.tree=a||[];
  this.groups={};
};
treeMenu.prototype={
  init:function(pid){
    this.group();
    return this.getDom(this.groups[pid]);
  },
  group:function(){
    for(var i=0;i';
      html+=this.getDom(this.groups[a[i].id]);
      html+='\n';
    };
    html+='\n';
    return html;
  }
};
var html=new treeMenu(zNodes).init(0);
alert(html);

java:

package test;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Collections;

/**
 * 多叉树类
*/
public class MultipleTree {
 public static void main(String[] args) {
 // 读取层次数据结果集列表 
 List dataList = VirtualDataGenerator.getVirtualResult(); 
 
 // 节点列表(散列表,用于临时存储节点对象)
 HashMap nodeList = new HashMap();
 // 根节点
 Node root = null;
 // 根据结果集构造节点列表(存入散列表)
 for (Iterator it = dataList.iterator(); it.hasNext();) {
  Map dataRecord = (Map) it.next();
  Node node = new Node();
  node.id = (String) dataRecord.get("id");
  node.text = (String) dataRecord.get("text");
  node.parentId = (String) dataRecord.get("parentId");
  nodeList.put(node.id, node);
 }
 // 构造无序的多叉树
 Set entrySet = nodeList.entrySet();
 for (Iterator it = entrySet.iterator(); it.hasNext();) {
  Node node = (Node) ((Map.Entry) it.next()).getValue();
  if (node.parentId == null || node.parentId.equals("")) {
  root = node;
  } else {
  ((Node) nodeList.get(node.parentId)).addChild(node);
  }
 }
 // 输出无序的树形菜单的JSON字符串
 System.out.println(root.toString());  
 // 对多叉树进行横向排序
 root.sortChildren();
 // 输出有序的树形菜单的JSON字符串
 System.out.println(root.toString()); 
 
 // 程序输出结果如下(无序的树形菜单)(格式化后的结果): 
 // {
 //  id : '100000', 
 //  text : '廊坊银行总行', 
 //  children : [
 //   {
 //   id : '110000', 
 //   text : '廊坊分行', 
 //   children : [
 //    {
 //    id : '113000', 
 //    text : '廊坊银行开发区支行', 
 //    leaf : true
 //    },
 //    {
 //    id : '111000', 
 //    text : '廊坊银行金光道支行', 
 //    leaf : true
 //    },
 //    {
 //    id : '112000', 
 //    text : '廊坊银行解放道支行', 
 //    children : [
 //     {
 //     id : '112200', 
 //     text : '廊坊银行三大街支行', 
 //     leaf : true
 //     },
 //     {
 //     id : '112100', 
 //     text : '廊坊银行广阳道支行', 
 //     leaf : true
 //     }
 //    ]
 //    }
 //   ]
 //   }
 //  ]
 // }

 // 程序输出结果如下(有序的树形菜单)(格式化后的结果):
 // {
 //  id : '100000', 
 //  text : '廊坊银行总行', 
 //  children : [
 //   {
 //   id : '110000', 
 //   text : '廊坊分行', 
 //   children : [
 //    {
 //    id : '111000', 
 //    text : '廊坊银行金光道支行', 
 //    leaf : true
 //    },
 //    {
 //    id : '112000', 
 //    text : '廊坊银行解放道支行', 
 //    children : [
 //     {
 //     id : '112100', 
 //     text : '廊坊银行广阳道支行', 
 //     leaf : true
 //     },
 //     {
 //     id : '112200', 
 //     text : '廊坊银行三大街支行', 
 //     leaf : true
 //     }
 //    ]
 //    },
 //    {
 //    id : '113000', 
 //    text : '廊坊银行开发区支行', 
 //    leaf : true
 //    }
 //   ]
 //   }
 //  ]
 // } 
 
 }
  
}


/**
* 节点类
*/
class Node {
 /**
 * 节点编号
 */
 public String id;
 /**
 * 节点内容
 */
 public String text;
 /**
 * 父节点编号
 */
 public String parentId;
 /**
 * 孩子节点列表
 */
 private Children children = new Children();
 
 // 先序遍历,拼接JSON字符串
 public String toString() { 
 String result = "{"
  + "id : '" + id + "'"
  + ", text : '" + text + "'";
 
 if (children != null && children.getSize() != 0) {
  result += ", children : " + children.toString();
 } else {
  result += ", leaf : true";
 }
  
 return result + "}";
 }
 
 // 兄弟节点横向排序
 public void sortChildren() {
 if (children != null && children.getSize() != 0) {
  children.sortChildren();
 }
 }
 
 // 添加孩子节点
 public void addChild(Node node) {
 this.children.addChild(node);
 }
}

/**
* 孩子列表类
*/
class Children {
 private List list = new ArrayList();
 
 public int getSize() {
 return list.size();
 }
 
 public void addChild(Node node) {
 list.add(node);
 }
 
 // 拼接孩子节点的JSON字符串
 public String toString() {
 String result = "["; 
 for (Iterator it = list.iterator(); it.hasNext();) {
  result += ((Node) it.next()).toString();
  result += ",";
 }
 result = result.substring(0, result.length() - 1);
 result += "]";
 return result;
 }
 
 // 孩子节点排序
 public void sortChildren() {
 // 对本层节点进行排序
 // 可根据不同的排序属性,传入不同的比较器,这里传入ID比较器
 Collections.sort(list, new NodeIDComparator());
 // 对每个节点的下一层节点进行排序
 for (Iterator it = list.iterator(); it.hasNext();) {
  ((Node) it.next()).sortChildren();
 }
 }
}

/**
 * 节点比较器
 */
class NodeIDComparator implements Comparator {
 // 按照节点编号比较
 public int compare(Object o1, Object o2) {
 int j1 = Integer.parseInt(((Node)o1).id);
   int j2 = Integer.parseInt(((Node)o2).id);
   return (j1 

以上这篇java、js中实现无限层级的树形结构方法(类似递归)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


推荐阅读
  • 探讨如何高效使用FastJSON进行JSON数据解析,特别是从复杂嵌套结构中提取特定字段值的方法。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 本文详细介绍了Git分布式版本控制系统中远程仓库的概念和操作方法。通过具体案例,帮助读者更好地理解和掌握如何高效管理代码库。 ... [详细]
  • 本文介绍了如何利用npm脚本和concurrently工具,实现本地开发环境中多个监听服务的同时启动,包括HTTP服务、自动刷新、Sass和ES6支持。 ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • 本文介绍如何在 Android 中通过代码模拟用户的点击和滑动操作,包括参数说明、事件生成及处理逻辑。详细解析了视图(View)对象、坐标偏移量以及不同类型的滑动方式。 ... [详细]
  • 本文总结了在使用Ionic 5进行Android平台APK打包时遇到的问题,特别是针对QRScanner插件的改造。通过详细分析和提供具体的解决方法,帮助开发者顺利打包并优化应用性能。 ... [详细]
  • 本文探讨了在 PHP 中处理 JSON 编码时中文字符显示为 Unicode 转义序列的问题,并提供了多种有效的解决方法,包括使用正则表达式替换、URL 编码以及利用 PHP 5.4 及以上版本提供的 JSON_UNESCAPED_UNICODE 选项。 ... [详细]
  • 本文探讨了如何在编程中正确处理包含空数组的 JSON 对象,提供了详细的代码示例和解决方案。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • Composer Registry Manager:PHP的源切换管理工具
    本文介绍了一个用于Composer的源切换管理工具——Composer Registry Manager。该项目旨在简化Composer包源的管理和切换,避免与常见的CRM系统混淆,并提供了详细的安装和使用指南。 ... [详细]
  • 最近团队在部署DLP,作为一个技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。 ... [详细]
author-avatar
育霖培伦861
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有