很多时候我们的datagrid需要动态的列显示,那么这个时候我们后台一般提供最直观的数据格式tree结构。那么需要我们前端自己根据这个tree结构转换成easyui的datagrid的columns。那么经过跟后台大神(陈汉军)同事一起的研究最后我整理了一个下面的函数来提供转换。

/*
*@author:yeminglong
*@date:2018/06/22
*@email:ye583025823@126.com
*@description:把treeNOde转换成easyui的datagrid或者treegrid的columns
*用法:
* var treeNode=[{text:"节点1",value:"myName","children";[{
"text": "ziduan51",
"value": "ziduan51",
"children": []
}]}];
* var columns= treeToColumns(treeNode);
*原理:先把treeNode的level计算出来,然后获取最大的maxLevel。
*跨行公式=maxLevel-currentNode.level+1;
*跨列公式=currentNode的children的childrenNode的children的length的和。
*感谢:陈汉军同学为本函数提供算法参考。本文的算法来自 陈汉军 同学的指导。再次感谢。
*/
(function (wd) {
var allLevel = [0],
maxLevel = 0,
columns = []; //获取最大层级
function getMaxLevel(allLevel) {
return Math.max.apply(null, allLevel);
} //把数据结构转换成自己需要的基本属性
function convert(nodes, parentNode) {
var node,
i = 0;
try {
for (; i < nodes.length; i++) {
node = nodes[i];
if (!parentNode) {
node.level = 0;
} else {
node.level = parentNode.level + 1;
allLevel.push(node.level);
} if (node.children.length > 0) {
node.cp = node.children.length;
convert(node.children, node);
}
else {
node.cp = 1;
}
}
} catch (e) {
//console.log();
} return nodes;
} //获取跨列
function getCospan(node) {
var colspan = 0;
for (var j = 0; j < node.children.length; j++) {
if(node.children[j].cp>1){
colspan +=getCospan(node.children[j]);
}else{
colspan += node.children[j].cp;
}
}
return colspan;
} //开始转换
function convert2(nodes, parentNode) {
for (var i = 0; i < nodes.length; i++) {
var node = nodes[i];
if (!columns[node.level]) {
columns[node.level] = [];
}
if (node.children.length > 0) {
columns[node.level].push({
field: node.value,
title: node.text,
rowspan: 1,
colspan: getCospan(node),
width: 200,
align: 'center'
});
convert2(node.children, node);
} else {
columns[node.level].push({
field: node.value,
title: node.text,
rowspan: (maxLevel - node.level + 1),
colspan: 1,
width: 200,
align: 'center'
});
} }
return columns;
} //提供给外面的全局函数
wd.treeToColumns = function (treeNode) {
allLevel = [0],
maxLevel = 0,
columns = [];
var node2 = convert(treeNode, null);
maxLevel = getMaxLevel(allLevel);
//console.log(maxLevel);
columns = convert2(node2);
//console.log(columns);
return columns;
} })(window);

用法示例:

var gridTitle = [
{
"text": "ziduan1",
"value": "ziduan1",
"children": [
{
"text": "ziduan11",
"value": "ziduan11",
"children": [
{
"text": "ziduan51",
"value": "ziduan51",
"children": []
},
{
"text": "ziduan52",
"value": "ziduan52",
"children": []
},
{
"text": "ziduan53",
"value": "ziduan53",
"children": []
},
{
"text": "ziduan54",
"value": "ziduan54",
"children": []
},
{
"text": "ziduan55",
"value": "ziduan55",
"children": []
}
]
},
{
"text": "ziduan12",
"value": "ziduan12",
"children": []
},
{
"text": "ziduan13",
"value": "ziduan13",
"children": []
},
{
"text": "ziduan14",
"value": "ziduan14",
"children": []
},
{
"text": "ziduan15",
"value": "ziduan15",
"children": []
}
]
},
{
"text": "ziduan2",
"value": "ziduan2",
"children": [
{
"text": "ziduan21",
"value": "ziduan21",
"children": []
},
{
"text": "ziduan22",
"value": "ziduan22",
"children": []
},
{
"text": "ziduan23",
"value": "ziduan23",
"children": []
},
{
"text": "ziduan24",
"value": "ziduan24",
"children": []
},
{
"text": "ziduan25",
"value": "ziduan25",
"children": []
}
]
},
{
"text": "ziduan3",
"value": "ziduan3",
"children": [
{
"text": "ziduan31",
"value": "ziduan31",
"children": []
},
{
"text": "ziduan32",
"value": "ziduan32",
"children": []
},
{
"text": "ziduan33",
"value": "ziduan33",
"children": []
},
{
"text": "ziduan34",
"value": "ziduan34",
"children": []
},
{
"text": "ziduan35",
"value": "ziduan35",
"children": []
}
]
},
{
"text": "ziduan4",
"value": "ziduan4",
"children": [
{
"text": "ziduan41",
"value": "ziduan41",
"children": []
},
{
"text": "ziduan42",
"value": "ziduan42",
"children": []
},
{
"text": "ziduan43",
"value": "ziduan43",
"children": []
},
{
"text": "ziduan44",
"value": "ziduan44",
"children": []
},
{
"text": "ziduan45",
"value": "ziduan45",
"children": []
},
]
},
{
"text": "ziduan5",
"value": "ziduan5",
"children": [
{
"text": "ziduan46",
"value": "ziduan46",
"children": []
},
{
"text": "ziduan47",
"value": "ziduan47",
"children": [ {
"text": "ziduan56",
"value": "ziduan56",
"children": []
},
{
"text": "ziduan57",
"value": "ziduan57",
"children": []
},
{
"text": "ziduan58",
"value": "ziduan58",
"children": []
},
{
"text": "ziduan59",
"value": "ziduan59",
"children": []
},
{
"text": "ziduan60",
"value": "ziduan60",
"children": []
}
]
},
{
"text": "ziduan48",
"value": "ziduan48",
"children": []
},
{
"text": "ziduan49",
"value": "ziduan49",
"children": []
},
{
"text": "ziduan50",
"value": "ziduan50",
"children": []
}
]
},
{
"text": "ziduan77",
"value": "ziduan77",
"children": [
{
"text": "ziduan78",
"value": "ziduan78",
"children": []
}
]
},
{
"text": "ziduan79",
"value": "ziduan79",
"children": [
{
"text": "ziduan80",
"value": "ziduan80",
"children": [{
"text": "ziduan81",
"value": "ziduan81",
"children": []
}]
}
]
} ];
var columns=treeToColumns(gridTitle);
$('#div1').datagrid({
fit: true,
columns: columns
})

如果这篇文章对您有帮助,您可以打赏我,您的打赏让我会更有动力。

技术交流QQ群:15129679

 
 

把tree结构数据转换easyui的columns的更多相关文章

  1. mktime(将时间结构数据转换成经过的秒数)

    mktime(将时间结构数据转换成经过的秒数)表头文件#include<time.h>定义函数time_t mktime(strcut tm * timeptr);函数说明mktime() ...

  2. 数据网格和树-EasyUI Datagrid 数据网格、EasyUI Propertygrid 属性网格、EasyUI Tree 树、EasyUI Treegrid 树形网格

    EasyUI Datagrid 数据网格 扩展自 $.fn.panel.defaults.通过 $.fn.datagrid.defaults 重写默认的 defaults. 数据网格(datagrid ...

  3. easyui datagrid columns 如何取得json 内嵌对象(many-to-one POJO class)

    http://www.iteye.com/problems/44119 http://hi.baidu.com/lapson_85/item/7733586e60b08500a1cf0f8d ———— ...

  4. B-tree & B+tree & B*Tree 结构浅析——转

    转自http://www.cnblogs.com/coder2012/p/3330311.html http://blog.sina.com.cn/s/blog_6776884e0100ohvr.ht ...

  5. 数据库查询,显示为树形结构(easyui+SSM)

    在实际项目上,有很多地方后台存了一个表,但是在显示查询的时候需要显示为树形结构. 本项目是easyui+SSM框架. 前台程序为: <!DOCTYPE html> <html> ...

  6. B-Tree 和 B+Tree 结构及应用,InnoDB 引擎, MyISAM 引擎

    1.什么是B-Tree 和 B+Tree,他们是做什么用的? B-Tree是为了磁盘或其它存储设备而设计的一种多叉平衡查找树,B-Tree 和 B+Tree 广泛应用于文件存储系统以及数据库系统中. ...

  7. 【技术宅6】把一个无限级分类循环成tree结构

    function list_to_tree($list,$root=0,$pk='cid',$pid = 'pid',$child = '_child'){ if(is_array($list)) { ...

  8. EasyUI datagrid columns 中 field 区分大小写

    columns: [ [ {field: 'id', title: 'ID'}, {field: 'name', title: 'NAME'}, {field: 'DT_CRT_TM', title: ...

  9. tree结构统一修改属性名(递归)

    1 //data为需要修改的tree,这里主要是为antd design 里面select规范数据 const ass = (data) => { let item = []; data.map ...

随机推荐

  1. 51nod1185 威佐夫游戏 V2 (模拟乘法)

    1185 威佐夫游戏 V2  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 有2堆石子.A B两个人轮流拿,A先拿.每次可以从一堆中取任意个或从2堆中取 ...

  2. hdu 1217 汇率 Floyd

    题意:给几个国家,然后给这些国家之间的汇率.判断能否通过这些汇率差进行套利交易. Floyd的算法可以求出任意两点间的最短路径,最后比较本国与本国的汇率差,如果大于1,则可以.否则不可以. 有向图 一 ...

  3. vtiger7安装设置

    安装界面一直报错 其实是设置的问题 error_reporting:E_WARNING & ~E_NOTICE & ~E_DEPRECATED max_execution_time:6 ...

  4. 【BZOJ4927】第一题 双指针+DP

    题解: 虽然是过了,不过做的十分智障 首先是有 2根 2 1 1 , 3根 1 1 1 这两种方法 然后考虑2 2 1 1 two-point-two没啥好说的 3 1 1 1 我很智障的以为数据范围 ...

  5. noip2016 天天爱跑步

    没看过正解..应该是些乱七八糟想不出来的东西 解法1: 首先,必须要做的是将每条路径拆成2个直的路径 那么对于那条从深度大的到深度小的路径 dep[x]-dep[y]应该等于观察时间 那么就可以在这些 ...

  6. Unix/Linux中/usr目录的由来

    在Linux系统中,有一个很重要的目录——/usr目录.关于这个目录名称的由来,网上主要有下面几种说法: user的缩写 User Shareable Read-only的缩写 Unix/User S ...

  7. sed & awk之sed

    sed处理文本的方法 sed在处理文本时,会先读取第一个输入行,将编辑命令应用于输入行,然后读取下一个输入行,并应用编辑命令.sed总是处理最新版本的行,因此sed中有多个编辑命令时,编辑命令的顺序对 ...

  8. Arbitrage HDU1217

    汇率转换问题: 怎么样才能套利 可以用Floyd算法: #include<bits/stdc++.h> using namespace std; ][]; int main() { int ...

  9. 082 HBase的几种调优(GC策略,flush,compact,split)

    一:GC的调优 1.jvm的内存 新生代:存活时间较短,一般存储刚生成的一些对象 老年代:存活时间较长,主要存储在应用程序中生命周期较长的对象 永久代:一般存储meta和class的信息 2.GC策略 ...

  10. turbo boost - 睿频加速

    turbo boost就是英特尔睿频加速技术 英特尔睿频加速技术是英特尔酷睿 i7/i5 处理器的独有特性,也是英特尔新宣布的一项技术.这项技术可以理解为自动超频.当开启睿频加速之后,CPU会根据当前 ...