`
chenshangge
  • 浏览: 88025 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类

java js 简单递归实现tree效果

阅读更多
因为业务要求做一个组织架构,就是理论上可以无限级的tree。第一次自己尝试写一棵树,分享一下过程。
解决这类不清楚有多少级节点的问题,用递归是最清爽的一个办法。


页面上最后展现的形式
<ul>
<li><div>一级节点</div>
  <ul>
    <li><div>二级节点</div>
        <ul>
          <li><div>三级节点</div></li>
        </ul>
    </li>
    <li><div>二级节点</div></li>   
</ul>


整理一下逻辑:前台需要的是一个List<HashMap>,list里每一个对象应该有一个key = "children" 对应的value 是List<HashMap>(子级节点数组),同理每一个子集节点还要有key="children"对应List<HashMap>,这样就形成了递归;

java后台:
首先根据我的一张组织架构的表如下



我们只需要关心 department_id 和 department_parent_id。
先把所有的department查询出来组成一个List<HashMap>,

下面我写了一个递归把没有层级结构的的List<HashMap>转化成前台需要的List<HashMap>
package com.asclepius.slhdt.uim.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;

public class TreeUtil {
	
	/**
	 * @param dataSource list数据源
	 * @param id	层级结构id	
	 * @param parentId	父级节点id
	 * @return	
	 */
	public static LinkedHashMap<String,HashMap> getTreeData(List<HashMap> dataSource,String id,String parentId)
	{
		LinkedHashMap returnMap = new LinkedHashMap();
		HashMap<String,String> root = new HashMap<String,String>();
		root.put(id, "");
		assembleTree(dataSource,root,id,parentId,1);
		returnMap.put("root",root);
		
		return returnMap;
	}
	
	public static void assembleTree(List<HashMap> dataSource,HashMap node ,String id,String parentId,Integer level)
	{
		List childList = getChildList(dataSource,node,id,parentId);
		node.put("children", childList);
		if(childList.size() > 0)
		{
			for(int i = 0 ; i<childList.size(); i++ )
			{
				HashMap child = (HashMap)childList.get(i);
				child.put("level", level);
				assembleTree(dataSource,child,id,parentId,level+1);
			}
		}
	}
	
	/**
	 * 得到子节点列表
	 */
	private static List getChildList(List<HashMap> dataSource,HashMap node,String id, String parentId )
	{
		List childList = new ArrayList();
		for (int i = 0; i < dataSource.size() ; i++) 
		{
			HashMap child = (HashMap)dataSource.get(i);
			String dictId = node.get(id).toString();
			String dictParentId = child.get(parentId).toString();
			if (dictId.equals(dictParentId))
			{
				childList.add(child);
				dataSource.remove(i);
				i--;
			}
		}
		return childList;
	}
}



返回给页面
LinkedHashMap<String,HashMap> hierarchyList = TreeUtil.getTreeData(departmentList,"departmentId","departmentParentId");
		List tree = (List)(hierarchyList.get("root").get("children"));
		
		return tree;




//组织架构树
	$.ajax({
		url:"/department/getdepartmentTree",
		type:"get",
		data:{hospitalId:hospital_id},
		success:function(data)
		{
			$(".subdivision").append(assembleTopTree(data));
		}
	});
/**
 * 组装一级节点
 */
function assembleTopTree(deptList)
{
	var $ul = $("<ul class='department-stair' id='deptTree' style='display:none' />");
	for(var i = 0; i<deptList.length; i++)
	{
		var $li=$("<li data-dept-id=" + deptList[i].departmentId + " >" +
				"<div class='department-name stair' >" +
				imgClick(deptList[i],true) +
				"</div>"+
				"<div class='subdivision-operate clearfix'>" +
				"<a href='javascript:void(0)' class='adddept'  data-dept-id="+deptList[i].departmentId + ">添加子部门</a>" +
				"<a href='javascript:void(0)' class='editdept' data-dept-id="+ deptList[i].departmentId + " >编辑</a><span>|</span>"+
				"<img class='delete' src='../../images/department/delete.png' data-dept-id="+ deptList[i].departmentId + " alt='删除' title='删除'/>" +
				mouseUpClass(i,deptList) + mouseDownClass(i,deptList) +
				"</div>" + assembleChildrenTree(deptList[i].children , deptList[i].departmentId)+"</li>");
		$ul.append($li);
	}
	return $ul;
}
/**
 * 组装子级节点
 */
function assembleChildrenTree(deptList,departmentId)
{
	var $ul = $("<ul class='department-stair' style='display:none' id="+ departmentId +"/>");
	for(var i = 0; i<deptList.length; i++)
	{
		var $li=$("<li data-dept-id=" + deptList[i].departmentId + "  >" +
				"<div class='department-name stair' >" +
				imgClick(deptList[i],false) +
				"</div>"+
				"<div class='subdivision-operate clearfix'>" +
				"<a href='javascript:void(0)' class='adddept'  data-dept-id="+deptList[i].departmentId + ">添加子部门</a>" +
				"<a href='javascript:void(0)' class='editdept' data-dept-id="+ deptList[i].departmentId + " >编辑</a><span>|</span>"+
				"<img class='delete' src='../../images/department/delete.png' data-dept-id="+ deptList[i].departmentId + " alt='删除' title='删除'/>" +
				mouseUpClass(i,deptList) + mouseDownClass(i,deptList) +
				"</div>" + assembleChildrenTree(deptList[i].children,deptList[i].departmentId) + "</li>");
		$ul.append($li);
	}
	
	return $ul[0].outerHTML;
}
/**
 * 是否有鼠标经过class
 */
function mouseUpClass(index , list)
{
	if(index == 0)
		return "<img class='move-up' style='opacity:0.4' src='../../images/department/move_up.png'  alt=''/>";
	else 
		return "<img  class='move-up' src='../../images/department/move_up.png'  alt=''/>";
}
/**
 * 是否有鼠标经过class
 */
function mouseDownClass(index , list)
{
	if(index == list.length - 1)
		return "<img class='move-down' style='opacity:0.4' src='../../images/department/move_down.png'  alt=''/>";
	else 
		return "<img class='move-down' src='../../images/department/move_down.png'  alt=''/>";
}
/**
 * 是否有展开按钮图标
 */
function imgClick(item , topOrChild)
{
	if(topOrChild)
		if(item.children.length > 0)
			return "<img src='../../images/department/arrow_right.png' data-dept-id="+item.departmentId +" style='margin-left:"+ item.level*10 +"px' /><span>"+ item.departmentProp.departmentNameAlias +"</span>"+
			(item.departmentProp.departmentClinical == 1 ? "<span class='identifier'>临床</span>" : "");
		else
			return "<span style='margin-left:"+ (14 + item.level*10) +"px' >"+ item.departmentProp.departmentNameAlias +"</span>"+
			(item.departmentProp.departmentClinical == 1 ? "<span class='identifier'>临床</span>" : "");
	else
		if(item.children.length > 0)
			return "<img src='../../images/department/arrow_right.png' data-dept-id="+item.departmentId +" style='margin-left:"+ item.level*10 +"px' /><span>"+ item.departmentProp.departmentNameAlias+"</span>"
			+(item.departmentProp.departmentClinical == 1 ? "<span class='identifier'>临床</span>" : "");
		else
			return "<span style='margin-left:"+ (14 + item.level*10) +"px' >"+ item.departmentProp.departmentNameAlias +"</span>" +
			(item.departmentProp.departmentClinical == 1 ? "<span class='identifier'>临床</span>" : "");
}





assembleChildrenTree中判断如果children长度不为0,再次调用assembleChildrenTree传入chidlren对应的List。最后的成果(css不在这里给出)

  • 大小: 32.9 KB
  • 大小: 41.6 KB
分享到:
评论

相关推荐

    java树结构递归里面详细说明

    树结构递归是Java后台常用的数据结构,通过递归函数来实现。树结构的用法实例包括树目录的总结、函数的参数说明、dtree.js文件的默认图片路径、页面中的书写规则、样式表的使用和页面代码书写的位置等。树结构可以...

    不用递归实现的无限级树型菜单

    `Tree.js`是自定义的JavaScript文件,负责解析XML数据,构建和管理树型菜单。这个文件中可能包含了前面提到的非递归算法实现,以及与`jquery.js`的交互逻辑。 至于`TreeImages`文件夹,它很可能包含了树型菜单的...

    java简单开发部门树(Tree)

    可以使用第三方库如jstree、treeview等,或者自定义渲染逻辑,实现拖拽排序、搜索功能等增强交互性。 7. **测试与调试**: - 对于开发的每个环节,都需要进行单元测试和集成测试,确保功能的正确性和稳定性。同时...

    java版list-map实现 树结构 父子结构 通俗易懂

    此java类实现了对数据表的分类递归树的实现,为本人倾力之作,后期,会发布js版,敬请期待!

    java动态树形(tree)

    Java 动态树形结构(Tree)是一种在用户界面中常用的数据展示方式,它能够以层级结构呈现数据,便于用户浏览和操作。在本实例中,我们主要关注如何使用Java和JSP技术来构建这样的动态树形视图,并结合SqlServer...

    java无限递归树+struts2

    在实际项目中,"javaTree"可能是一个包含实现无限递归树所需类和方法的Java文件或者模块,可能包括了树节点类、树构建算法以及与Struts2、Hibernate、Spring的交互逻辑。 总之,这个项目涉及到使用Struts2作为前端...

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

    在Java中,虽然没有直接使用递归,但`addChildren`方法的循环逻辑实现了类似的效果,因为它不断地为每个父节点添加子节点,直到所有子节点都被处理完毕。 在实际应用中,这种无限层级的树形结构可以用于实现如文件...

    java解析xml动态生成树形菜单结构

    在这个场景下,`Java`作为后端语言负责处理业务逻辑和数据解析,`XML`作为数据交换格式存储菜单信息,而`JavaScript`则用于在前端实现交互效果,如菜单的展开、收缩和全选功能。接下来,我们将详细探讨如何利用这些...

    使用递归删除树形结构的所有子节点(java和mysql实现)

    使用递归删除树形结构的所有子节点(java和mysql实现) 在树形结构中删除某个父节点时,需要递归删除其所有子节点,以避免遗留冗余数据。下面将为大家介绍使用 Java 和 MySQL 实现递归删除树形结构的所有子节点的...

    tree-sitter-java:树保姆的Java语法

    通过JavaScript实现,它能够无缝集成到Node.js环境中,为Web开发者提供了一种在浏览器环境中解析Java代码的能力。 使用tree-sitter-java,你可以: 1. **实时语法检查**:在编辑器插件中集成tree-sitter-java,...

    javascript开源树tree代码

    JavaScript,简称JS,是Web开发中的主要脚本语言,广泛应用于网页和浏览器端,而Java则是一种独立的面向对象的编程语言,常用于服务器端开发。 在描述中提到,这个开源树的Demo对学习Tree非常有帮助,这意味着它...

    java动态树形菜单

    本示例是一个基于Java实现的JSP动态树形菜单功能,旨在提供一个简单而全面的解决方案,覆盖了从数据获取到页面渲染的全过程。 首先,我们要理解树形菜单的基本概念。树形菜单是由节点(通常代表菜单项)构成的层级...

    js tree构建菜单树

    JavaScript Tree 是一种在Web应用程序中实现可交互树形结构的技术,它主要依赖于JavaScript和HTML来构建。在本文中,我们将深入探讨如何使用JavaScript(尤其是jQuery库)来创建动态的菜单树,以及与之相关的web开发...

    java实现无限级分类树形,连接mysql数据库

    本教程将介绍如何利用Java来实现这种功能,并结合MySQL数据库进行数据存储,同时通过AJAX技术实现页面的异步刷新。 首先,我们需要建立一个Java实体类来表示树形结构中的节点。这个类通常包含ID(主键)、名称、父...

    java实现ztree异步加载

    本文将详细讲解如何使用Java来实现ZTree的异步加载功能。 首先,我们需要理解ZTree异步加载的基本原理。ZTree通过Ajax请求向服务器获取数据,服务器端(这里为Java)处理请求并返回JSON格式的节点数据。ZTree接收到...

    基于jsTree的无限级树JSON数据的转换

    2. 实现一个递归函数,用于将数据库中的树结构转换为符合jsTree要求的JSON格式。 3. 在前端使用jsTree库,通过Ajax请求获取并解析JSON数据,展示树形视图。 通过这样的方式,我们可以有效地将后台无限级的树结构...

    tree12-30.rar_目录树_目录树 java语言_目录树 js

    本文将详细讨论如何使用Java语言和JavaScript(JS)来实现这一功能,基于提供的标题"tree12-30.rar_目录树_目录树 java语言_目录树 js"和描述"自己修改成功的java代码+js动态生成目录树结构"。 首先,让我们深入...

    带有checkbox的TREE列表级联的选择子栏目的JAVA标签形式的实现

    本文将详细讲解如何实现一个带有复选框(Checkbox)的树形列表(TREE LIST)的级联选择功能,以及相关的Java标签形式实现。这种功能常见于权限管理、组织结构选择等场景,让用户能够方便地进行多层级的勾选操作。 ...

    JSP实现树型结构TREE

    本例"JSP实现树型结构TREE"提供了一个使用JSP(JavaServer Pages)、EXTJS(一个前端JavaScript框架)、JSON(JavaScript Object Notation)以及MySQL数据库来创建树形结构的示例,这对于初学者或开发者来说,是一个...

    javascript如何用递归写一个简单的树形结构示例

    现在有一个数据,需要你渲染出对应的列表出来: var data = [ {"id":1}, {"id":2}, {"id":3}, {"id":4}, ]; var str="&lt;ul&gt;";...data.forEach(function(v,i){ str+="&lt;li&gt;&lt;span&gt;"+v.id+"&lt;/span&gt;&lt;/li&gt;" ...

Global site tag (gtag.js) - Google Analytics