/*
*
* TreeTable 0.1 - Client-side TreeTable Viewer!
* @requires jQuery v1.3
*
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
*
*/ (function($){
$.extend({
treetable: new function() { this.defaults = {
id_col: 0,
parent_col: 1,
handle_col: 2,
order_col: -1,
open_img: "lib/plugin/treetable/images/minus.gif",
close_img: "lib/plugin/treetable/images/plus.gif",
expanded: true//@author GaoBing
}; //jquery的trim处理不了 产生的"空格"
function trim(str){
return str.replace(/(^[\s\xA0]*)|([\s\xA0]*$)/g, "");
} this.construct = function(settings){ if(this.size()!=1)return;//只处理一个表格 if(this[0].tagName.toUpperCase()!="TBODY")return;//只应用于tbody var config = $.extend({}, $.treetable.defaults, settings); if(config.id_col==null || config.parent_col==null || config.handle_col==null ) return; var $this = $(this);
var tr_arr = new Array();
var tr_sort = new Array(); //构建行对象数组
$this.find("tr").each(function(){
var id = $.trim($(this).find("td:eq("+config.id_col+")").text());
var parent = $.trim($(this).find("td:eq("+config.parent_col+")").text());
tr_arr.push({'id':id,'parent':parent,'level':0,'node':'leaf','expanded':config.expanded,'obj':$(this)});
});
var len = tr_arr.length;
var level = 0; /*
检查tr_arr中的每一行的父行是否再tr_sort中,
如果有则插入到tr_sort的父行后,从tr_arr中删除
直到tr_arr都为null,生成排好序的tr_sort
*/
while(len>0){
for(var i=0;i<tr_arr.length;i++){
var o = tr_arr[i]; if(o==null)continue; if(o.parent==""){//根行直接压入tr_sort
tr_sort.push(o);
tr_arr[i]=null;
len=len-1;
}else{
if (tr_sort.length > 0){
for(var j=0;j<tr_sort.length;j++){
if(tr_sort[j].id==o.parent){
o.level = tr_sort[j].level+1;//从父行累计生成层次level
tr_sort[j].node='node';
tr_sort.splice(j+1,0,o);//数组插入
tr_arr[i]=null;
len=len-1;
break;
}
}
}else{
for(var k=0;k<tr_arr.length;k++){
var ok = tr_arr[k];
if(ok == null) continue;
if (o.id != ok.parent && ok.parent != ""){
ok.level = tr_arr[k].level+1;
tr_sort.push(ok);
tr_arr[i]=null;
len=len-1;
}else{
if (tr_sort[k]){
o.level = tr_sort[k].level+1;//从父行累计生成层次level
tr_sort[k].node='node';
tr_sort.splice(k+1,0,o);//数组插入
tr_arr[i]=null;
len=len-1;
break;
}
}
}
}
}
}
level=level+1;
}//while //展开事件动作函数
var fn_click = function(){ var id = trim($(this).parent().parent().find("td:eq("+config.id_col+")").text());//获取当前行ID
var v = -1;
for(var j=0;j<tr_sort.length;j++){
var o = tr_sort[j];
if(o.id==id){//在tr_sort找到行对象 if(o.node=='leaf')return; v = o.level;
var img = o.obj.find("td:eq("+config.handle_col+") img")[0]; if(!o.expanded){//通过图标判断是展开还是收起
img.src=config.open_img;
o.expanded=true;
}else{
img.src=config.close_img;
o.expanded=false;
} var show = o.expanded;
var f = false;//父行收起标志
var tmp = 0;//父行的层次 for(var i=j+1;i<tr_sort.length;i++){//根据level更新后续的子行
o = tr_sort[i]; var img = o.obj.find("td:eq("+config.handle_col+") img")[0]; var t = !o.expanded;//判断是否是收起状态 if(o.level>v && show){//展开操作
if(!f&&!t){//父行未收起,且当前行是展开状态
o.obj.show();
}else if(!f&&t){//父行未收起,且当前行是收起状态
tmp = o.level;
f = true;
o.obj.show();
}else if(f&&o.level<=tmp){//同级的前一行是收起状态
if(!t){
f=false;
}else{
tmp = o.level;
}
o.obj.show();
}else{
;
} }else if(o.level>v && !show){//收起操作则隐藏所以子行
o.obj.hide();
}else if(o.level<=v){//到达非子行,处理完毕
break;
}
} break;
}
}
}; //重新绘制表格,添加展开动作图标
for(var j=tr_sort.length-1;j>-1;j--){//prepend插入tbody内需使用反序
var o = tr_sort[j]; var img = $("<img src='"+config.open_img+"'>");
img.click(fn_click); var tr=o.obj.find("td:eq("+config.handle_col+")"); //避免重复添加图标
var imgEle = tr.find("img");
if(imgEle.length == 0){
tr.prepend(" ");
tr.prepend(img);
var s = new Array((o.level+1)*5).join(" ");//生成缩进空格
tr.prepend(s); $this.prepend(o.obj);
} }//for /*
* @author GaoBing
* 是否展开 当expanded为false时,父节点收缩
* */
if(tr_sort.length > 0){
for(var i=0;i<tr_sort.length;i++){
var o = tr_sort[i];//行对象
var img = o.obj.find("td:eq("+config.handle_col+") img");//父节点图标元素
if(o.expanded == false){//收缩
//检查是否有父节点,如有父节点则隐藏本行节点
if (o.parent != ""){
o.obj.hide();//隐藏子节点
}
//检查是否有子节点,有子节点则替换图标
for(var j=0;j<tr_sort.length;j++){
if (tr_sort[j].parent != "" && tr_sort[j].parent == o.id){//有子节点
$(img).attr("src",config.close_img);//替换父节点图标
}
}
}
}
} }//construct
}//treetable }); $.fn.extend({
treetable: $.treetable.construct
}); })(jQuery); /**
* @author GaoBing
* 功能:对树状表格进行排序 父节点在前 子节点在后
**/
function treetable_sort(tableId,parentColumn){ var trs = new Array(); //拿到所有行
$("#" + tableId + " tbody tr[role='row']").each(function(index){
trs[index] = $(this).clone(true);
}); //清空之前的行数据
$("#" + tableId + " tbody").empty(); //递归
sort_tr_root(trs,tableId,parentColumn); } /*根节点排序*/
function sort_tr_root(trs,tableId,parentColumn){
var rootArr = new Array();
for(var i=0;i<trs.length;i++){
if (null != trs[i]){
var trsData = trs[i].attr("data");
var trsDataObj = eval('(' + trsData + ')');
var trsId = trsDataObj['id'];
var trsParentId = trsDataObj[ parentColumn ];
if (null == trsParentId || trsParentId == "" || undefined == trsParentId){//最外层的根
trs[i].attr("id",trsId);
$("#" + tableId + " tbody").append(trs[i]);
rootArr.push(trs[i]);
trs[i] = null;
}
}
} //子节点排序
var treeData = changeDataToMap(trs);
var result = createSearchMap(trs,parentColumn);
for(var i=0;i<rootArr.length;i++){
var rootData = rootArr[i].attr("data");
var rootDataObj = eval('(' + rootData + ')');
var rootId = rootDataObj['id'];
var rootParentId = rootDataObj[ parentColumn ];
buildChild(tableId,treeData,result,rootId,rootParentId);
} } function createSearchMap(data,parentColumn){
//创建搜索键值对
var result = {};
for(var i=0;i<data.length;i++) {
if (null != data[i]){
var trsData = data[i].attr("data");
var trsDataObj = eval('(' + trsData + ')');
var trId = trsDataObj['id'];
var trParentId = trsDataObj[parentColumn];
if(trParentId){
if(!result[trParentId] && trParentId != null && trParentId != ""){
result[trParentId] = [];
}
result[trParentId].push(trId);
}
}
}
return result;
} function changeDataToMap(trs){
var deepMap = new Array();
for(var i=0;i<trs.length;i++){
if (null != trs[i]){
var trsData = trs[i].attr("data");
var trsDataObj = eval('(' + trsData + ')');
var trId = trsDataObj['id'];
if(trId){
deepMap[trId] = trs[i];
}
}
}
return deepMap;
} function buildChild(tableId,treeData,result,id,parentId){
if (parentId){
var trObj = treeData[id];
trObj.attr("id",id);
$("#" + tableId + " tbody tr[role=row][id=" + parentId + "]").after(trObj);
}
var childrenIds = result[id];
if(childrenIds){
for(var i=0;i<childrenIds.length;i++){
buildChild(tableId,treeData,result,childrenIds[i],id);
}
}
} /*判断是否包含某个元素*/
Array.prototype.contains = function (element) { // 利用Array的原型prototype点出一个我想要封装的方法名contains
for (var i = 0; i < this.length; i++) {
if (this[i] == element) { // 如果数组中某个元素和你想要测试的元素对象element相等,则证明数组中包含这个元素,返回true
return true;
}
}
}; /**
* @author GaoBing
* 功能:表格树 供datatable调用接口
**/
function initTreeTable(obj){ //参数
var tableId = obj.tableId;//表格ID
var tbodyId = obj.tbodyId;//表格中tbodyID
var isExpanded = obj.isExpanded;//是否展开所有节点
var viewConfig = obj.viewConfig;//展示配置
var parentColumn = obj.parentColumn;//父列 //排序 父节点排在子节点前面
treetable_sort(tableId,parentColumn); //默认属性
$.treetable.defaults={
id_col: viewConfig[0],//ID td列 {从0开始}
parent_col: viewConfig[1],//父ID td列
handle_col: viewConfig[2],//操作展开操作的 td列
open_img: "lib/plugin/treetable/images/minus.gif",//展开时图标
close_img: "lib/plugin/treetable/images/plus.gif",//收缩时图标
expanded: isExpanded//true为展开,false为收缩
}; //生成树
$("#" + tbodyId).treetable(); //隐藏数据列
$("#" + tbodyId + " tr").find("td:eq(" + viewConfig[0] + ")").hide();
$("#" + tbodyId + " tr").find("td:eq(" + viewConfig[1] + ")").hide();
$("#" + tableId + " tr:eq(0)").find("th:eq(" + viewConfig[0] + ")").hide();
$("#" + tableId + " tr:eq(0)").find("th:eq(" + viewConfig[1] + ")").hide();
}

  

treeTable实现排序的更多相关文章

  1. jQuery.treetable使用及异步加载

    Usage 1 GitHub 地址 https://github.com/ludo/jquery-treetable/ 2 API 地址 http://ludo.cubicphuse.nl/jquer ...

  2. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  3. iOS可视化动态绘制八种排序过程

    前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...

  4. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

  5. [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序

    用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html  目录 马桶排序(令人 ...

  6. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  7. 算法与数据结构(七) AOV网的拓扑排序

    今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...

  8. 使用po模式读取豆瓣读书最受关注的书籍,取出标题、评分、评论、题材 按评分从小到大排序并输出到txt文件中

    #coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ...

  9. javascript排序

    利用array中的sort()排序 w3cfunction sortNumber(a,b) { return a - b } var arr = new Array(6) arr[0] = " ...

随机推荐

  1. Cookie、Session、localStorage、sessionStorage区别和用法

    Cookie 在学习一个新知识点前,我们应该明白自己的学习目标,要带着疑问去学习,该小节须要了解 Cookies 什么是cookie,cookie的作用 cookie的工作机制,即cookie是运作流 ...

  2. git diff 比较差异

    说明 以下命令可以不指定 <filename>,表示对全部文件操作. 命令涉及和 Git本地仓库对比的,均可指定 commit 的版本. HEAD 最近一次 commit HEAD^ 上次 ...

  3. 【Git 系列】一个超好用的命令你会用吗?

    stash在英文意思是隐藏.git stash 的作用也是隐藏没完成的代码,防止它干扰别人或者新分支的工作. 一.背景 1.1 我们经常会遇到这样的情况 正在 dev 分支开发新功能,做到一半时有人过 ...

  4. Django 小实例S1 简易学生选课管理系统 6 实现登录逻辑

    Django 小实例S1 简易学生选课管理系统 第6节--实现登录逻辑 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 1 业务逻辑 本教程第四节里 ...

  5. [bzoj5510]唱跳rap和篮球

    显然答案可以理解为有(不是仅有)0对情况-1对情况+2对情况-- 考虑这个怎么计算,先计算这t对情况的位置,有c(n-3t,t)种情况(可以理解为将这4个点缩为1个,然后再从中选t个位置),然后相当于 ...

  6. [bzoj3329]Xorque

    首先将问题转化为2x^x=3x,那么相当于让x右移一位和原数的1不相交,即不含有相邻的1,第一个问题可以直接数位dp,第二个问题可以类似dp+矩乘优化即可 1 #include<bits/std ...

  7. [loj3180]天桥

    考虑将所有交点作为关键点来建图跑最短路,但图上的关键点数量最坏为$o(nm)$,需要优化 当$s=0$且$g=n-1$的部分分,有以下结论: 1.对于一段天桥$([l,r],y)$,不会从$(r,y) ...

  8. 智能 Request 推荐,K8s 资源利用率提升 252%

    作者 王孝威,FinOps 认证从业者,腾讯云容器服务产品经理,热衷于为客户提供高效的 Kubernetes 使用方式,为客户极致降本增效服务. 余宇飞,FinOps 认证从业者,腾讯云专家工程师,从 ...

  9. es插件安装

    首先安装找到一样版本的地址: Release v7.6.1 · medcl/elasticsearch-analysis-ik (github.com) 下载最上面的编译版 将文件解压到plugins ...

  10. idea解决Command line is too long. Shorten command line for ServiceStarter or also for Application报错

    找到 .idea\workspace.xml: 找到<component name="PropertiesComponent">,在里面添加<property n ...