js实现td排序及分组分类

如题

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     <style type="text/css">
         .tbl-list, .tbl-list td, .tbl-list th {
             border: solid 1px #000;
             border-collapse: collapse;
             padding: 10px;
             margin: 15px;
         }
     </style>
     <script type="text/javascript" src="http://lib.sinaapp.com/js/jquery/1.7.2/jquery.min.js"></script>
     <title>table sort</title>
     <script type="text/javascript">
         //排序 tableId: 表的id,iCol:第几列 ;dataType:iCol对应的列显示数据的数据类型
         function sortAble(th, tableId, iCol, dataType) {

             var ascChar = "▲";
             var descChar = "▼";

             var table = document.getElementById(tableId);

             //排序标题加背景色
             for (var t = 0; t < table.tHead.rows[0].cells.length; t++) {
                 var th = $(table.tHead.rows[0].cells[t]);
                 var thText = th.html().replace(ascChar, "").replace(descChar, "");
                 if (t == iCol) {
                     th.css("background-color", "#ccc");
                 }
                 else {
                     th.css("background-color", "#fff");
                     th.html(thText);
                 }

             }

             var tbody = table.tBodies[0];
             var colRows = tbody.rows;
             var aTrs = new Array;

             //将得到的行放入数组,备用
             for (var i = 0; i < colRows.length; i++) {
                 //注:如果要求“分组明细不参与排序”,把下面的注释去掉即可
                 //if ($(colRows[i]).attr("group") != undefined) {
                     aTrs.push(colRows[i]);
                 //}
             }

             //判断上一次排列的列和现在需要排列的是否同一个。
             var thCol = $(table.tHead.rows[0].cells[iCol]);
             if (table.sortCol == iCol) {
                 aTrs.reverse();
             } else {
                 //如果不是同一列,使用数组的sort方法,传进排序函数
                 aTrs.sort(compareEle(iCol, dataType));
             }

             var oFragment = document.createDocumentFragment();
             for (var i = 0; i < aTrs.length; i++) {
                 oFragment.appendChild(aTrs[i]);
             }
             tbody.appendChild(oFragment);

             //记录最后一次排序的列索引
             table.sortCol = iCol;

             //给排序标题加“升序、降序” 小图标显示
             var th = $(table.tHead.rows[0].cells[iCol]);
             if (th.html().indexOf(ascChar) == -1 && th.html().indexOf(descChar) == -1) {
                 th.html(th.html() + ascChar);
             }
             else if (th.html().indexOf(ascChar) != -1) {
                 th.html(th.html().replace(ascChar, descChar));
             }
             else if (th.html().indexOf(descChar) != -1) {
                 th.html(th.html().replace(descChar, ascChar));
             }

             //重新整理分组
             var subRows = $("#" + tableId + " tr[parent]");
             for (var t = subRows.length - 1; t >= 0 ; t--) {
                 var parent = $("#" + tableId + " tr[group=‘" + $(subRows[t]).attr("parent") + "‘]");
                 parent.after($(subRows[t]));
             }
         }

         //将列的类型转化成相应的可以排列的数据类型
        function convert(sValue, dataType) {
             switch (dataType) {
                 case "int":
                     return parseInt(sValue, 10);
                 case "float":
                     return parseFloat(sValue);
                 case "date":
                     return new Date(Date.parse(sValue));
                 case "string":
                 default:
                     return sValue.toString();
             }
         }

         //排序函数,iCol表示列索引,dataType表示该列的数据类型
         function compareEle(iCol, dataType) {
             return function (oTR1, oTR2) {

                 var vValue1 = convert(removeHtmlTag($(oTR1.cells[iCol]).html()), dataType);
                 var vValue2 = convert(removeHtmlTag($(oTR2.cells[iCol]).html()), dataType);
                 if (vValue1 < vValue2) {
                     return -1;
                 }
                 else {
                     return 1;
                 }

             };
         }

         //去掉html标签
         function removeHtmlTag(html) {
             return html.replace(/<[^>]+>/g, "");
         }

         //jQuery加载完以后,分组行高亮背景,分组明细隐藏
         $(document).ready(function () {
             $("tr[group]").css("background-color", "#ff9");
             $("tr[parent]").hide();
         });

         //点击分组行时,切换分组明细的显示/隐藏
        function showSub(a) {
             var groupValue = $(a).parent().parent().attr("group");
             var subDetails = $("tr[parent=‘" + groupValue + "‘]");
             subDetails.toggle();
         }

     </script>
 </head>

 <body>

     <table id="tableId" class="tbl-list" cellpadding="0" cellspacing="0" style="table-layout:fixed;">
         <thead>
             <tr>
                 <th>序号</th>
                 <th width="100px" onclick="sortAble(this,‘tableId‘, 1,‘string‘)"
                     style="cursor:pointer">姓名</th>
                 <th width="200px" onclick="sortAble(this,‘tableId‘, 2, ‘date‘)"
                     style="cursor:pointer">生日</th>
                 <th width="100px" onclick="sortAble(this,‘tableId‘, 3, ‘int‘)"
                     style="cursor:pointer">年龄</th>
                 <th width="100px" onclick="sortAble(this,‘tableId‘, 4, ‘float‘)"
                     style="cursor:pointer">工资</th>
             </tr>
         </thead>
         <tbody>
             <tr group="A">
                 <td>1</td>
                 <td><a href="#" onclick="showSub(this)">Group-A</a></td>
                 <td>01/12/1982</td>
                 <td>25</td>
                 <td>1000.50</td>
             </tr>
             <tr parent="A">
                 <td>2</td>
                 <td>A-01</td>
                 <td>01/09/1982</td>
                 <td>25</td>
                 <td>2000.10</td>
            </tr>
             <tr parent="A">
                 <td>3</td>
                 <td>A-02</td>
                 <td>01/10/1982</td>
                 <td>26</td>
                 <td>2000.20</td>
             </tr>
             <tr group="B">
                 <td>4</td>
                 <td><a href="#" onclick="showSub(this)">Group-B</a></td>
                 <td>10/14/1999</td>
                 <td>18</td>
                 <td>1000.20</td>
             </tr>
             <tr parent="B">
                 <td>5</td>
                 <td>B-01</td>
                 <td>02/12/1982</td>
                 <td>19</td>
                 <td>3000.20</td>
             </tr>
             <tr parent="B">
                 <td>6</td>
                 <td>B-02</td>
                 <td>03/12/1982</td>
                 <td>20</td>
                 <td>3000.30</td>
             </tr>
             <tr group="C">
                 <td>7</td>
                 <td><a href="#" onclick="showSub(this)">Group-C</a></td>
                 <td>10/14/1980</td>
                 <td>8</td>
                 <td>1000.30</td>
             </tr>
             <tr parent="C">
                 <td>8</td>
                 <td>C-01</td>
                 <td>03/12/1981</td>
                 <td>17</td>
                 <td>3100.30</td>
             </tr>
         </tbody>
     </table>
 </body>
 </html>
时间: 2024-08-29 15:20:30

js实现td排序及分组分类的相关文章

MySQL进阶5--分组排序和分组查询 group by(having) /order by

MySQL进阶--分组排序和分组查询 group by(having) /order by /* 介绍分组函数 功能:用做统计使用,又称为聚合函数或组函数 1.分类: sum, avg 求和 /平均数, 只处理数值型,都绝对忽略NULL值(avg处理时统计的个数没有null项) max ,min ,可以求字符串最大最小 ,可以匹配日期,都绝对忽略NULL值 count ,不计算NULL ,不把null算进数里 #2. 参数支持类型 SELECT MIN(last_name) ,MAX(last_

Hadoop学习笔记—11.MapReduce中的排序和分组

一.写在之前的 1.1 回顾Map阶段四大步凑 首先,我们回顾一下在MapReduce中,排序和分组在哪里被执行: 从上图中可以清楚地看出,在Step1.4也就是第四步中,需要对不同分区中的数据进行排序和分组,默认情况下,是按照key进行排序和分组. 1.2 实验场景数据文件 在一些特定的数据文件中,不一定都是类似于WordCount单次统计这种规范的数据,比如下面这类数据,它虽然只有两列,但是却有一定的实践意义. 3 3 3 2 3 1 2 2 2 1 1 1 (1)如果按照第一列升序排列,当

php基于左右值排序的无限分类算法

PHP无限分类[左右值]算法 <?php /** * 基于左右值排序的无限分类算法 * 数据库结果为 CREATE TABLE om_catagory ( CatagoryID int(10) unsigned NOT NULL auto_increment, Name varchar(50) default '', Lft int(10) unsigned NOT NULL default '0', Rgt int(10) unsigned NOT NULL default '0', PRIM

hive分组排序函数 分组取top10

hive分组排序函数 分组取top10 语法:row_number() over( partition by 字段a order by 计算项b desc) rank --这里rank是别名 Partition by:类似hive的建表,分区的意思 这里按字段a分区,对计算项b进行降序排序 实例: 要取top10品牌,各品牌的top10渠道,各品牌的top10渠道中各渠道的top10档期 1) 取top10品牌 Select 品牌,count/sum/其他() as num from tb_na

最常用的SQL排序、分组与统计的使用方法

以一种有意义的方式组织数据可能是一项挑战.有时你需要的可能是一个简单的排序,但是通常你需要做更多,你需要分组来进行分析和统计.幸运的是,SQL提供了大量语句和操作来进行排序,分组和摘要.下面的一些技巧将会帮助你识别什么时候排序,什么时候分组,什么时候以及如何统计.对要每条语句和操作的详细信息请查看Books Online. 1. 使用排序使数据有序 通常,你的所有数据真正需要的仅仅是按某种顺序排列.SQL的ORDER BY语句可以以字母或数字顺序组织数据.因此,相似的值按组排序在一起.然而,这个

ListView中排序和分组(GroupTemplate)的使用实例演示

.aspx代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="8_Group_Sort.aspx.cs" Inherits="Group_Sort" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3

数据库结果为 基于左右值排序的无限分类算法

<?php /**     * 基于左右值排序的无限分类算法     * 数据库结果为 CREATE TABLE om_catagory (      CatagoryID int(10) unsigned NOT NULL auto_increment,     Name varchar(50) default '',      Lft int(10) unsigned NOT NULL default '0',      Rgt int(10) unsigned NOT NULL defau

MapReduce框架排序和分组

前言: Mapreduce框架就是map->reduce,其中Map中的<key,value>是偏移量和行值,在其之前会使用job.setInputFormatClass定义的InputFormat将输入的数据集分割成小数据块splites,同时InputFormat提供一个RecordReder的实现.本例子中使用的是TextInputFormat,他提供的RecordReder会将文本的一行的行号作为key,这一行的文本作为value.这就是自定义Map的输入是<LongWri

(转)最常用的SQL排序、分组与统计的使用方法 Order by/Group by/having等的使用

以一种有意义的方式组织数据可能是一项挑战.有时你需要的可能是一个简单的排序,但是通常你需要做更多,你需要分组来进行分析和统计.幸运的 是,SQL提供了大量语句和操作来进行排序,分组和摘要.下面的一些技巧将会帮助你识别什么时候排序,什么时候分组,什么时候以及如何统计.对要每条语句 和操作的详细信息请查看Books Online. 1. 使用排序使数据有序 通常,你的所有数据真正需要的仅仅是按某种顺序排列.SQL的ORDER BY语句可以以字母或数字顺序组织数据.因此,相似的值按组排序在一起.然而,