玩转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 服务器(一)> 中介绍了 ...
 
随机推荐
- iOS评分功能、APP中打开其他应用程序
			
1.评分功能 iOS中评分支持功能开发非常简单. NSString *str = [NSString stringWithFormat: @"itms-apps://itunes.apple ...
 - ThreadPoolExecutor运行机制
			
最近发现几起对ThreadPoolExecutor的误用,其中包括自己,发现都是因为没有仔细看注释和内部运转机制,想当然的揣测参数导致,先看一下新建一个ThreadPoolExecutor的构建参数: ...
 - 数据结构---队列C语言实现
			
#include <stdio.h> #include <stdlib.h> //队列大小 #define SIZE 1024 static int queue[SIZE] = ...
 - LeetCode(53)-Binary Tree Paths
			
题目: Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree ...
 - 不容忽视的js面试题
			
1.全局变量和局部变量(变量提升和连等赋值问题) (function() { var a = b = 5; })(); console.log(a); console.log(b); 上面代码运行结果 ...
 - IT轮子系列(一)——DropDownList 的绑定,你秒懂了吗
			
前言 最近猛然惊觉(说是猛然,是因为自己工作那么多年,居然不自知.不反省),在开发中,自己碰到一些常用的功能代码块,还是习惯性的baidu,然后copy....这样的操作,不知自己重复了多少遍.现在回 ...
 - div学习之div中dl-dt-dd的详解
			
dl dt dd认识及dl dt dd使用方法 <dl> 标签用于定义列表类型标签. dl dt dd目录 dl dt dd介绍 结构语法 dl dt dd案例 dl dt dd总结 一. ...
 - j2EE经典面试题
			
1. hibernate中离线查询去除重复项怎么加条件? dc.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 2. http协议及端口,sm ...
 - javaScript(3)---语法、关键保留字及变量
			
学习要点: 1.语法构成 2.关键字保留字 3.变量 任何语言的核心都必然会描述这门语言最基本的工作原理.而JavaScript的语言核心就是ECMAScript 一.语法构成 区分大小写:ECMAS ...
 - redis+twemproxy实现redis集群
			
Redis+TwemProxy(nutcracker)集群方案部署记录 转自: http://www.cnblogs.com/kevingrace/p/5685401.html Twemproxy 又 ...