- 论坛徽章:
- 0
|
js 实现 table 行排序
闲时无聊,参考网上一些资料,写了一个 SortTableTool.js 实现table行排序.
关键代码如下:
Java代码- /** object
- * example : sortTableT.sort('theTable',0,'int')
- *
- **/
- var sortTableT = new SortTableTool();
- /** function
- * SortTableTool
- */
- function SortTableTool(){
- /** is sort all tBodies */
- this.isSortAlltBodies = false;
- };
- /** SortTableTool.sort
- * tableId : table.id
- * sortColumn : cell'index of row
- * nodeType : cell data type
- */
- SortTableTool.prototype.sort = function(tableId, sortColumn ,nodeType) {
- var table = document.getElementById(tableId);
- var _tbody_length = this.isSortAlltBodies ? table.tBodies.length : 1;
-
- var rowArray = new Array();
- var rowIndex = 0;
- for(var t=0 ; t< _tbody_length ; t++){
- var tableBody = table.tBodies[t];
- var tableRows = tableBody.rows;
- for (var i = 0; i < tableRows.length; i++) {
- rowArray[rowIndex++] = tableRows[i];
- }
- }
- if (table.sortColumn == sortColumn) {
- rowArray.reverse();
- } else {
- rowArray.sort(generateCompareTR(sortColumn, nodeType));
- }
- var tbodyFragment = document.createDocumentFragment();
- for (var i = 0; i < rowArray.length; i++) {
- tbodyFragment.appendChild(rowArray[i]);
- }
- tableBody.appendChild(tbodyFragment);
- table.sortColumn = sortColumn;
- }
- var generateCompareTR = function(sortColumn, nodeType) {
- return function compareTR(trLeft, trRight) {
- var left_firstChild = trLeft.cells[sortColumn].firstChild;
- var right_firstChild = trRight.cells[sortColumn].firstChild;
- var leftValue = this.convertData(left_firstChild == null ? "" :left_firstChild.nodeValue, nodeType);
- var rightValue = this.convertData(right_firstChild == null ? "" :right_firstChild.nodeValue, nodeType);
- if (leftValue < rightValue) {
- return -1;
- }else if (leftValue > rightValue) {
- return 1;
- }else{
- return 0;
- }
- };
- }
- var convertData = function(_value, dataType) {
- var value = (_value == null ) ? "" : _value;
- var v_result = null;
- switch (dataType) {
- case "int":
- v_result = parseInt(value.trim().replace(/,/g,''));
- return isNaN(v_result) ? null : v_result ;
- case "float":
- v_result = parseFloat(value.trim().replace(/,/g,''));
- return isNaN(v_result) ? null : v_result;
- case "string":
- return value.toString().ltrim();
- case "date":
- v_result = new Date(Date.parse(value.trim().replace(/-/g,'/')));
- return isNaN(v_result) ? null : v_result;
- default:
- return value.toString();
- }
- }
- /**
- * String.prototype.trim
- * @return
- */
- String.prototype.trim=function(){
- return this.replace(/(^\s*)|(\s*$)/g, '');
- }
- String.prototype.ltrim=function(){
- return this.replace(/(^\s*)/g,"");
- }
- String.prototype.rtrim=function(){
- return this.replace(/(\s*$)/g,"");
- }
- //------------------ over --------------------------
- /** object
- * example : sortTableT.sort('theTable',0,'int')
- *
- **/
- var sortTableT = new SortTableTool();
- /** function
- * SortTableTool
- */
- function SortTableTool(){
- /** is sort all tBodies */
- this.isSortAlltBodies = false;
- };
- /** SortTableTool.sort
- * tableId : table.id
- * sortColumn : cell'index of row
- * nodeType : cell data type
- */
- SortTableTool.prototype.sort = function(tableId, sortColumn ,nodeType) {
- var table = document.getElementById(tableId);
- var _tbody_length = this.isSortAlltBodies ? table.tBodies.length : 1;
-
- var rowArray = new Array();
- var rowIndex = 0;
- for(var t=0 ; t< _tbody_length ; t++){
- var tableBody = table.tBodies[t];
- var tableRows = tableBody.rows;
- for (var i = 0; i < tableRows.length; i++) {
- rowArray[rowIndex++] = tableRows[i];
- }
- }
- if (table.sortColumn == sortColumn) {
- rowArray.reverse();
- } else {
- rowArray.sort(generateCompareTR(sortColumn, nodeType));
- }
- var tbodyFragment = document.createDocumentFragment();
- for (var i = 0; i < rowArray.length; i++) {
- tbodyFragment.appendChild(rowArray[i]);
- }
- tableBody.appendChild(tbodyFragment);
- table.sortColumn = sortColumn;
- }
- var generateCompareTR = function(sortColumn, nodeType) {
- return function compareTR(trLeft, trRight) {
- var left_firstChild = trLeft.cells[sortColumn].firstChild;
- var right_firstChild = trRight.cells[sortColumn].firstChild;
- var leftValue = this.convertData(left_firstChild == null ? "" :left_firstChild.nodeValue, nodeType);
- var rightValue = this.convertData(right_firstChild == null ? "" :right_firstChild.nodeValue, nodeType);
- if (leftValue < rightValue) {
- return -1;
- }else if (leftValue > rightValue) {
- return 1;
- }else{
- return 0;
- }
- };
- }
- var convertData = function(_value, dataType) {
- var value = (_value == null ) ? "" : _value;
- var v_result = null;
- switch (dataType) {
- case "int":
- v_result = parseInt(value.trim().replace(/,/g,''));
- return isNaN(v_result) ? null : v_result ;
- case "float":
- v_result = parseFloat(value.trim().replace(/,/g,''));
- return isNaN(v_result) ? null : v_result;
- case "string":
- return value.toString().ltrim();
- case "date":
- v_result = new Date(Date.parse(value.trim().replace(/-/g,'/')));
- return isNaN(v_result) ? null : v_result;
- default:
- return value.toString();
- }
- }
- /**
- * String.prototype.trim
- * @return
- */
- String.prototype.trim=function(){
- return this.replace(/(^\s*)|(\s*$)/g, '');
- }
- String.prototype.ltrim=function(){
- return this.replace(/(^\s*)/g,"");
- }
- String.prototype.rtrim=function(){
- return this.replace(/(\s*$)/g,"");
- }
- //------------------ over --------------------------
复制代码 效果如下图:
测试多次,发现一个棘手的问题:
如果单元格中有 ,则 convertData 中无法去除
各位大家,有什么好的方法和建议,可留言我. |
|