玩转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 服务器(一)> 中介绍了 ...
随机推荐
- Java中的50个关键字
form:http://blog.csdn.net/luoweifu/article/details/6776240 Java中的50个关键字 关键字也称为保留字,是指java语言中规定了特定含义的标 ...
- 做自己的软件的Gallery(一)
先上效果图: 如图,android默认也有Gallery,很多软件在调用时,都是使用自己的Gallery,一方面好维护,另外一方面可以做优化.要做成以上样式,图片加载类起至关重要,一不小心,就好OOM ...
- javascript中通过元素id和name直接取得元素
我们知道一些第三方的js库对如何快速选取html中的元素做了一些简化,貌似十分高深莫测,其实也不然.而且js本身自带了对于特殊元素的简便选取的方法,下面就为大家简单介绍下. 在html中,一般最直接的 ...
- 点击劫持漏洞之理解 python打造一个挖掘点击劫持漏洞的脚本
前言: 放假了,上个星期刚刚学习完点击劫持漏洞.没来的及写笔记,今天放学总结了一下 并写了一个检测点击劫持的脚本.点击劫持脚本说一下哈.= =原本是打算把网站源码 中的js也爬出来将一些防御的代码匹配 ...
- subsets(子集)
Given a set of distinct integers, nums, return all possible subsets (the power set). Note: The solut ...
- Spring的事务 之 9.4 声明式事务 ——跟我学spring3
9.4 声明式事务 9.4.1 声明式事务概述 从上节编程式实现事务管理可以深刻体会到编程式事务的痛苦,即使通过代理配置方式也是不小的工作量. 本节将介绍声明式事务支持,使用该方式后最大的获益是简 ...
- DB2常见问题
15.1实例常见问题和诊断案例 1.实例无法启动问题 db2nodes.cfg文件,主要是为了数据库分区设计的.如果实例无法启动,要检查db2nodes.cfg,看配置是否正常.db2systm实例配 ...
- c语言,文件操作总结
C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来 ...
- AI 学习之路
前言:本文章纯属自己学习路线纪录,不喜勿喷. 最近AI很火,几乎是个程序员 都要去学习AI,作为一个菜鸡小前端,我也踏上了学习AI的方向. 在学习之中,最开始遇到了很多的困难,比如你不知道如何切入进来 ...
- java.lang.SecurityException: Can't make field constructor accessible
原本使用GsonConvertor,在Android版本5.1.1上没有任何问题,结果切换到版本6.0.1上,出现以下所示问题: java.lang.IllegalArgumentException: ...