玩转web之ligerui(二)---前缀编码生成树(分级码)实现树型表格
请珍惜小编劳动成果,该文章为小编原创,转载请注明出处。
背景:
var TreeDeptData = { Rows : [
{ id: '01', name: "企划部", remark: "1989-01-12",
children: [
{ id: '0101', name: "企划分部一", remark: "企划分部一"
},
{ id: '0102', name: "企划分部二", remark: "企划分部二", children:
[
{ id: '010201', name: "企划分部二 A组", remark: "企划分部二 A组" },
{ id: '010202', name: "企划分部二 B组", remark: "企划分部二 B组" }
]
},
{ id: '0103', name: "企划分部三", remark: "企划分部三" }
]
},
{ id: '02', name: "研发部", remark: "研发部" },
{ id: '03', name: "产品部", remark: "产品部" }
]
};
所以说,我们需要把普通的数据表格需要的json数据转化成这种样式。接下来我将向大家说一下我是怎么实现该功能的。
数据表的要求:
create table gradeDemo(
id int IDENTITY, -- id
gradeNum varchar(1), --级别
prev varchar(60), --前缀码
gradeCode varchar(60), --分级码
brotherNum varchar(5), --兄弟节点个数
childrenNum varchar(5) --孩子节点个数
);
其中分级码是从1-9,兄弟节点个数不包括自己,下面是数据表截图:
辅助类:
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import net.sf.json.JSONArray; public class ObjectByJson { //参数格式:[{id:'id1',code:'code1',name:'name1'},{id:'id2',code:'code2',name:'name2'}]
public List<Map<String, Object>> getListMapByJSONArrayFromJson(String json) {
List list = new ArrayList();
JSONArray array = JSONArray.fromObject(json);
Map o = null;
for (int i = 0; i < array.size(); i++) {
o = (Map) array.get(i);
list.add(o);
}
return list;
}
}
核心代码:
package OpenSrc.Platform.CommonFun.Json; import java.util.ArrayList;
import java.util.List;
import java.util.Map; /**
* 功能 : 将json转换成树形表格需要的json数据
* 内容简介:
**
* 创建日期:2014/05/24
* 创建人 :debug_run
* 版权所有:FFA团队
*/
public class TreeDataByJson {
ObjectByJson objectByJson=new ObjectByJson();;
String girdJson="";
public TreeDataByJson(){
}
/** 功能 : 将json转换成树形表格需要的json数据
* 内容简介:
**
* 创建日期:2014/05/24
* 创建人 :<span style="font-family: Arial, Helvetica, sans-serif;">debug_run</span> * @param jsonString
* @return
*/
public String getTreeJsonByJson(String jsonString){
try {
getTreeJsonByJson(jsonString,9);
} catch (StopMsgException e) {
//System.out.println(e);
}
return girdJson;
}
/** 功能 : 将json转换成树形表格需要的json数据
* 内容简介:
**
* 创建日期:2014/05/24
* 创建人 :<span style="font-family: Arial, Helvetica, sans-serif;">debug_run</span><span style="font-family: Arial, Helvetica, sans-serif;"> </span>
* @param jsonStr
* @return
*/
public void getTreeJsonByJson(String jsonString,int gradeNum){
String json="";
List<Map<String, Object>> newList1= new ArrayList<Map<String, Object>>(); //用于存放重新排好的数据(高层次)
List<Map<String, Object>> newList2= new ArrayList<Map<String, Object>>(); //用于存放重新排好的数据
String jsonStr=jsonString.substring(8, jsonString.length()-1); //获取jsonArray的那部分,去掉前边的rows:{
List<Map<String, Object>> list =objectByJson.getListMapByJSONArrayFromJson(jsonStr); //得到一个listMap
List removeList=new ArrayList(); //用来保存需要删除的数据的下标
for(int i=0;i<list.size();i++){
Map<String, Object> map=list.get(i); //当前的map
if(Integer.parseInt(map.get("gradeNum").toString())==gradeNum){ //低层
newList1.add(map);
removeList.add(i);
}
if(Integer.parseInt(map.get("gradeNum").toString())==(gradeNum-1)&&!map.get("childrenNum").equals("0")){ //高层且有孩子
newList2.add(map);
removeList.add(i);
} }//for if(newList2.size()==0||newList1.size()==0){
if(gradeNum==2){
girdJson=jsonString;
throw new StopMsgException(); //强制退出
}
getTreeJsonByJson(jsonString,(gradeNum-1));
}
for(int i=0;i<removeList.size();i++){ //从list中删除应该被删除的数据
int j=(Integer) removeList.get(i);
j=j-i; //每删除一个,其他的数据的下表前移
list.remove(j);
}
System.out.println(list.size());
for(int j=0;j<newList2.size();j++){ //遍历所有高层的数据
String gradeCode=newList2.get(j).get("gradeCode").toString(); //高层的分级码
String children="children:[";
for(int k=0;k<newList1.size();k++){ //遍历所有低层的数据
String prev=newList1.get(k).get("prev").toString();
if(prev.equals(gradeCode)){ //低层次的前缀码等于于高层次的分级码
children+=newList1.get(k)+",";
}
}
if(!children.equals("children:[")){
children=children.substring(0,children.length()-1);
}
children+="]}";
String oldData=newList2.get(j).toString(); //旧的数据
String newData="["+oldData.substring(0,oldData.length()-1)+","+children+"]"; //加上孩子后的数据,写成json数组的格式
Map<String, Object> newMap=objectByJson.getListMapByJSONArrayFromJson(newData).get(0); //把合并的数据转成map
newList2.set(j,newMap); //重新加入到高层次的list里
// }
}//for
for(int i=0;i<newList2.size();i++){ //将合并后的两个list---newList2转成json{},{},{}
json+=newList2.get(i)+",";
}
json=json.substring(0,json.length()-1); //去掉最后的逗号
String newJson="";
for(int i=0;i<list.size();i++){ //将list剩余的值再转成json,
newJson+=list.get(i)+",";
}
newJson="{\"Rows\":["+newJson+json+"]}"; //获取新的json串
if(gradeNum>2){ //若girdJson改变,就要退出递归
getTreeJsonByJson(newJson,(gradeNum-1));
}
if(girdJson==""){
girdJson=newJson;
System.out.println(girdJson);
throw new StopMsgException(); //强制退出递归
}
}
static class StopMsgException extends RuntimeException {
} }
上面的代码为核心代码,使用时调用getTreeJsonByJson(String jsonString)方法,参数是一个普通数据表格所需要的json数据,通过调用后将返回一个属树形表格所需要的json数据。
测试:
{
"Rows": [
{
"id": 1,
"brotherNum": "1",
"childrenNum": "1",
"gradeNum": "1",
"gradeCode": "001",
"prev": "0"
},
{
"id": 3,
"brotherNum": "0",
"childrenNum": "2",
"gradeNum": "2",
"gradeCode": "00101",
"prev": "001"
},
{
"id": 4,
"brotherNum": "1",
"childrenNum": "0",
"gradeNum": "3",
"gradeCode": "0010101",
"prev": "00101"
},
{
"id": 5,
"brotherNum": "1",
"childrenNum": "0",
"gradeNum": "3",
"gradeCode": "0010102",
"prev": "00101"
},
{
"id": 2,
"brotherNum": "1",
"childrenNum": "0",
"gradeNum": "1",
"gradeCode": "002",
"prev": "0"
}
]
}
{
"Rows": [
{
"id": 2,
"brotherNum": "1",
"childrenNum": "0",
"gradeNum": "1",
"gradeCode": "002",
"prev": "0"
},
{
"id": 1,
"brotherNum": "1",
"childrenNum": "1",
"gradeNum": "1",
"gradeCode": "001",
"prev": "0",
"children": [
{
"id": 3,
"brotherNum": "0",
"childrenNum": "2",
"gradeNum": "2",
"gradeCode": "00101",
"prev": "001",
"children": [
{
"id": 4,
"brotherNum": "1",
"childrenNum": "0",
"gradeNum": "3",
"gradeCode": "0010101",
"prev": "00101"
},
{
"id": 5,
"brotherNum": "1",
"childrenNum": "0",
"gradeNum": "3",
"gradeCode": "0010102",
"prev": "00101"
}
]
}
]
}
]
}
总结:
版权声明:本文为博主原创文章,未经博主允许不得转载。
玩转web之ligerui(二)---前缀编码生成树(分级码)实现树型表格的更多相关文章
- 玩转Web之easyui(二)-----easy ui 异步加载生成树节点(Tree),点击树生成tab(选项卡)
关于easy ui 异步加载生成树及点击树生成选项卡,这里直接给出代码,重点部分代码中均有注释 前台: $('#tree').tree({ url: '../servlet/School_Tree?i ...
- 玩转Web之JavaScript(二)-----javaScript语法总结(二) 涉及Date与数组的语法
Date: document.write(document.lastModified) 网页最后一次更新时间 a=new Date(); //创建 a 为一个新的时期象 y=a.getY ear( ...
- 玩转web之ligerui(一)---ligerGrid重新指定url
请珍惜小编劳动成果,该文章为小编原创,转载请注明出处. 在特定情况下,我们需要重新指定ligerGrid的url来获取不同的数据,在这里我说一下我用的方法: 首先先定义一个全局变量,然后定义liger ...
- 玩转web之ligerui(一)---ligerGrid又一次指定url
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012116457/article/details/27109227 请珍惜小编劳动成果.该文章为小 ...
- 第二十二章、 Model/View便利类树型部件QTreeWidget
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 树部件(Tree Widget)是Qt Designer中 Item Widgets(It ...
- Web Service 的创建简单编码、发布和部署
最近,老大准备将已有的C/S架构项目中的通信部分做成通用,需要将其支持WebService为以后项目向着B/S架构升级做好铺垫,为此身为屌丝的我去各种百度WebService是个什么卵玩意,然后逐渐搭 ...
- Java Web高性能开发(二)
今日要闻: 性价比是个骗局: 对某个产品学上三五天个把月,然后就要花最少的钱买最多最好的东西占最大的便宜. 感谢万能的互联网,他顺利得手,顺便享受了智商上的无上满足以及居高临下的优越感--你们一千块买 ...
- 分分钟带你玩转 Web Services【2】CXF
在实践中一直在使用 JAX-WS 构建 WebService 服务,服务还是非常稳定.高效的. 但还是比较好奇其他的 WebService 开源框架,比如:CXF/Axis2/Spring WS等. ...
- JavaSE 手写 Web 服务器(二)
原文地址:JavaSE 手写 Web 服务器(二) 博客地址:http://www.extlight.com 一.背景 在上一篇文章 <JavaSE 手写 Web 服务器(一)> 中介绍了 ...
随机推荐
- 数据包接收系列 — IP协议处理流程(二)
本文主要内容:在接收数据包时,IP协议的处理流程. 内核版本:2.6.37 Author:zhangskd @ csdn blog 我们接着来看数据包如何发往本地的四层协议. ip_local_del ...
- Select、Poll与Epoll比较
(1)select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志 ...
- LeetCode之旅(19)-Power of Two
题目 Given an integer, write a function to determine if it is a power of two. Credits: Special thanks ...
- obj-c编程10:Foundation库中类的使用(2)[字符串,数组]
Foundation库的内容不可谓不多,就算很精简的说篇幅也受不了啊!笨猫一向反对博客文章一下子拖拖拉拉写一大坨!KISS哦!so将上一篇文章再分一篇来说,于是有了这篇,可能还会有(3)哦... 我发 ...
- PhpStorm php配置环境
如果你需要在Windows上安装PHP环境,并使用PhpStorm进行脚本编写进行编译,不需要WEB环境展示,那么本小结适合. 软件环境:Windows10+PHP7.1+PhpStorm2018 0 ...
- C#编译器优化那点事
使用C#编写程序,给最终用户的程序,是需要使用release配置的,而release配置和debug配置,有一个关键区别,就是release的编译器优化默认是启用的. 优化代码开关即optimize开 ...
- mysql性能优化之-innodb_flush_log_at_trx_commit
innodb_flush_log_at_trx_commit是配置MySql日志何时写入硬盘的参数: 一.参数值说明 0:log buffer将每秒一次地写入log file中,并且log file的 ...
- WSGI及gunicorn指北(二)
pyg0已经大概了解了wsgi.现在他决定深入探索他们实际在生产环境里用到的web 服务器 -gunicorn. 先来看看官网的介绍:Gunicorn 是一个运行在Unix上的python WSGI ...
- Coursera-AndrewNg(吴恩达)机器学习笔记——第三周
一.逻辑回归问题(分类问题) 生活中存在着许多分类问题,如判断邮件是否为垃圾邮件:判断肿瘤是恶性还是良性等.机器学习中逻辑回归便是解决分类问题的一种方法.二分类:通常表示为yϵ{0,1},0:&quo ...
- 哈夫曼树【最优二叉树】【Huffman】
[转载]只为让价值共享,如有侵权敬请见谅! 一.哈夫曼树的概念和定义 什么是哈夫曼树? 让我们先举一个例子. 判定树: 在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设 ...