【提出需求】

点击表格头部的时候根据对应列的所有值来进行排序,最终显示排序后的数据行。

【具体效果】

【步骤思路】

点击需要排序列的数据头,获取数据头所在列的索引。通过索引找到每一行所对应列的数据,之后对该列的所有数据进行排序(本实例只进行降序排列),排序结果的每个数据的索引就是该数据所对应行的位置。

【问题解决】

1、如何知道那一列需要排序?

想要知道那些一列的数据需要排序,实现的方法有很多种,但是最重要的一点是必须要知道所点击的头部所在的列数。最简单的方法就是给需要排序的头部添加排序列名,之后判断该点击的头部是否是排序列名(判断的方式也有很多种,本实例使用的是className属性,因为就只有一个类名。还有其他方式getAttribute、match、search、indexOf、lastIndexOf等函数),如果是则执行排序处理代码块,如果不是则不做任何的处理。

if(this.className)

相关知识点:

文章:JavaScript对Html元素的Class操作 - className、classList、Attribute

文章:JavaScript字符串和数值对象

2、虽然获取了排序列的索引,但是如何获取每一行的所对应列的数据呢?

排序列有一个特征就是相同一列所在行的索引都是相同的,所以获取了排序列的索引之后,只需要获取每一行的节点集合,然后再访问其节点内容的数据列集合,然后再通过索引去访问对应数据列的数据(通过innerText获取数据的文本值,如果数据是数值字符的话,一般会自动转化为数值,不过最好人为转化以下)。

ContTrList[j].getElementsByTagName("td")[this.index].innerText;

相关知识点:

文章:JavaScript之DOM操作总结

3、虽然获取了每一行的数据,但是如何知道排序后该数据对应的是哪一行数据?

想要解决这个问题也有很多种方式,但是都比较困难,例如可以通过自定义属性,但是这种方式无法解决跨域问题,也可以通过其他数组存储索引等等。本实例使用了二维数组,对每组数组元素的第二个元素赋予该数值对应行的索引值,从而解决无法跨域或者获取麻烦的问题的

for(var j = 0; j < ContTrList.length; j++) {//该for循环是遍历内容区中的tr标签,并且查找对应的td标签sortArray[j][0] = ContTrList[j].getElementsByTagName("td")[this.index].innerText;sortArray[j][1] = j;
}

相关知识点:

文章:JavaScript数组Array对象知识点详解

文章: JavaScript创建二维数组或多维数组

注意:排序之前,需要确定行内的数据是数值还是字符串,是升序还是降序等等。通常的方法自然是遍历所有的列数据,看最终返回的结果。本实比较懒,只对第一个进行了判断,在这里安利一波isNaN ()函数。isNaN() 函数用于检查其参数是否是非数字值。如果是非数字值,则返回true,否则返回false。这样我就省去了通过正则表达式去数据是字符还是数值了。

//判断是数值排序还是字符排序
if(!isNaN(sortArray[0][0])){sortArray.sort(sortNumber);
}else{sortArray.sort();
}

4、获取了行索引之后,如何更新行数据呢?

索引是无法重复的,所以我们可以通过循环去访问排序后的数值所对应的行索引,这里要注意的是我们获取的只是对应行的节点。所以想要更新数据行也有很多种方法,例如:删除容器内的所有数据行子节点,之后通过遍历一个一个的插入。本实例直接通过拼接数据行的HTML字符串,直接更新父容器的数据行。

//排序完毕之后开始调序
for(var x = 0; x < ContTrList.length; x++) {newNodeHtml += "<tr>" + ContTrList[sortArray[x][1]].innerHTML + "</tr>";
}
//删除当前内容,插入新的内容
Container.innerHTML = newNodeHtml;

相关知识点:

文章:JavaScript之DOM操作总结

【最终代码】

//HTML代码
<table border="1" cellpadding="5" style="border-collapse: collapse;text-align: center;"><tbody><tr id="HeadTD"><td class="sort">姓名</td><td class="sort">学号</td><td class="sort">语文</td><td class="sort">数学</td><td class="sort">英语</td><td class="sort">总分</td><td class="sort">平均分</td></tr></tbody><tbody id="ContTD"><tr><td>张三</td><td>220305</td><td>11</td><td>22</td><td>33</td><td>22</td><td>44</td></tr><tr><td>李四</td><td>220302</td><td>33</td><td>44</td><td>66</td><td>99</td><td>33</td></tr><tr><td>黄五</td><td>220307</td><td>22</td><td>55</td><td>22</td><td>55</td><td>66</td></tr><tr><td>赵六</td><td>220303</td><td>44</td><td>22</td><td>33</td><td>66</td><td>88</td></tr></tbody>
</table>//JavaScript代码
window.onload = function() {var HeadTD = document.getElementById("HeadTD");var ContTD = document.getElementById("ContTD");var HeadList = HeadTD.getElementsByTagName("td");var ContTrList = ContTD.getElementsByTagName("tr");var sortArray = new Array();var newNode;for(var i = 0; i < HeadList.length; i++) {HeadList[i].index = i;HeadList[i].onclick = function() {if(this.className) {newNode = "";for(var j = 0; j < ContTrList.length; j++) {sortArray[j] = new Array();sortArray[j][0] = ContTrList[j].getElementsByTagName("td")[this.index].innerText;sortArray[j][1] = j;}if(!isNaN(sortArray[0][0])){sortArray.sort(sortNumber);}else{sortArray.sort();}for(var x = 0; x < ContTrList.length; x++) {newNode += "<tr>" + ContTrList[sortArray[x][1]].innerHTML + "</tr>";}ContTD.innerHTML = newNode;}}}
}
function sortNumber(b, a) {if(a > b) {return 1} else if(a < b) {return -1} else {return 0}
}

【前端实例】JavaScript对Table数据进行排序操作相关推荐

  1. Html表格导出word,JavaScript 导出Table数据到Word和Excel

    1.如果Table中有Input(text)之类的元素,需要先修改Input的outerHTML: 具体例子:function resetInput() { var controls = docume ...

  2. elemet UI 中表格数据的排序操作

    入上图所示,我们要对"拨打次数"."通话次数","通话时间" 进行排序.这里有什么办法呢? 其实排序的主要工作量是在后端,前端只需要将 排序 ...

  3. 对datatable类型列名排序_表格数据的排序功能(支持多列)

    官方排序组件说明介绍 [表格数据]- 排序 1.功能说明 对 DataFrame 数据进行排序操作. 2.基本使用说明 在"df"参数内传入 DataFrame 数据集,例如传入[ ...

  4. mysql分组排列的查询语句_数据的排序与分组语句_MySQL

    bitsCN.com 数据的排序与分组语句 使用SQL语句执行查询操作时,我们可能发现查询出的数据结果的排序是无序的.为了更好的观察数据表中的查询结果,开发人员或者用户经常要对查询的数据进行排序操作, ...

  5. html table清空数据,javascript清空table表格的方法

    本文实例讲述了javascript清空table表格的方法.分享给大家供大家参考.具体如下: 1. 通常方法 循环table的rows,然后一个一个删除. 这个方法是通常的方法,可行,但是效率不好. ...

  6. R语言对dataframe的行数据进行排序(Ordering rows)实战:使用R原生方法、data.table、dplyr等方案

    R语言对dataframe的行数据进行排序(Ordering rows)实战:使用R原生方法.data.table.dplyr等方案 目录

  7. R语言基于多字段(多数据列、multiple columns)对dataframe的行数据进行排序(Ordering rows)实战:使用R原生方法、data.table、dplyr等方案

    R语言基于多字段(多数据列.multiple columns)对dataframe的行数据进行排序(Ordering rows)实战:使用R原生方法.data.table.dplyr等方案 目录

  8. jquery table ajax,JQuery Ajax动态加载Table数据的实例讲解

    我们在jsp定义一个select和一个table,要求实现根据select的选值,动态加载table数据. table第一次加载数据的function定义如下: function loadData() ...

  9. R语言使用order函数按照两个数据列的值排序data.table数据(主变量降序排序、次变量升序排序)

    R语言使用order函数按照两个数据列的值排序data.table数据(主变量降序排序.次变量升序排序) 目录

最新文章

  1. win10系统的“管理员”
  2. 什么时候是创业最佳时机?7个最佳的励志创业时机GET了吗
  3. SpringBoot-14-MyBatis预热篇,MySQL小结
  4. 【深度学习】协同优化器和结构化知识蒸馏
  5. 前端面试题整理(css)
  6. CV书单-Benjio PAMI review (up tp 2013)
  7. 数据结构与算法 / 编辑器和编译器如何判定括号是否合法
  8. Storm 02_Storm 计算模型
  9. 《算法竞赛进阶指南》0.5排序
  10. python可以处理的文件类型_Python学习笔记之数据类型与文件处理
  11. Python+django网页设计入门(8):网站项目文件夹布局
  12. 解决办法——Qtdemo软件无法加载example的问题
  13. 9550电机_扭矩公式9550是什么 电机扭矩计算公式T=9550P/n怎么算
  14. 七种应刻意训练的顶级思维方法
  15. [补集转化 有序化去重] Ural 1212 Battleship
  16. 如何用命令行的形式进行仿真及do脚本的使用(仿真工具使用技巧)【Modesim/Questasim】
  17. photoshop---压缩图片大小/给人物换衣服
  18. 大疆 L1 任务文件格式说明(CLC/CLI/CMI/IMU/LDR/MNF/RTB/RTK/RTL/RTS/JPG/MOV)
  19. HDFS命令:hdfs dfs
  20. 怎样才能让孩子愿意和家长合作

热门文章

  1. VMware Workstation中桥接模式、NAT模式、仅主机模式
  2. Android 恢复出厂设置(系统时间不修改)
  3. 校园日记和白领日记如何让支付宝在社交圈火起来?
  4. 正确使用苹果手机技巧的3个方法,你知道吗?
  5. 随手记怎么样靠谱吗?随手记AA级企业信用评级证书
  6. 好好养生,身体第一,工作第二
  7. 视频教程-JSP从入门到精通2016+在线视频教学平台项目实训-其他
  8. 将1,2,…,9 共 9 个数分成 3 组,分别组成 3 个三位数,且使这 3 个三位数构成 1 : 2 : 3 的比例,试求出所有满足条件的 3个三位数---Java解法
  9. 民生银行信用卡 java_民生银行信用卡电子账单读取
  10. 10. java之多态