玩转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 服务器(一)> 中介绍了 ...
随机推荐
- C语言之linux内核实现最大公约数算法
最大公约数算法,又称欧几里德算法,至今已有几千年的历史了.在我们开始学习C语言的时候最常用的算法就是辗转相除法,其实在linux内核中,内核也是使用这样的方法实现两数最大公约数的计算. 两个整数的最大 ...
- 剑指offer面试题48: 最长不含重复字符的子字符串
Given a string, find the length of the longest substring without repeating characters.(请从子字符串中找出一个最长 ...
- Binary Tree Level Order Traversal II(层序遍历2)
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...
- 读JVM相关的一些笔记
1.JVM的运行模式 vm一般有两种运行模式,client和server(JDK 7 后有第三种 Tiered server,后续会涉及到). client : 启动快,内存占用少,JIT编译器生成代 ...
- web集群时session同步的3种方法[转]
在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,一个登录用户,一会是登录状态,一会又不是 ...
- jtds驱动更新对一个老问题的解决
07年年末的一篇blog: 以前网站做初期开发时,有一个问题:hibernate下text大字符串读取时出这个异常:JDBCExceptionReporter - The amount of data ...
- 获取radio、select、checkbox标签选中的值
<input type="radio" id="radio1" name="radio"><label for=" ...
- js判断是否下拉刷新
if(document.body.scrollTop + window.innerHeight>=document.body.clientHeight-10){ this.loadPointsL ...
- C语言出来多久了你知道吗?
在20世纪80年代,为了避免不同开发者使用的C语言语法的差异,美国国家标准局为C语言开发了一套完整的美国国家标准语言文法,称为ANSI C,作为C语言的初始标准.. [1] 2011年12月8日,国际 ...
- H5之画布canvas小记,以及通过画布实现原子无规则运动
我们知道html在h5出之前就仅仅只是一个标签,一个标记,语义化并不强,后来新增的标签如video,audio都是语义化更强(让人一看就懂是什么东西,反正我是这么理解的,一个div不代表着什么),本身 ...