1

Pls check the jsFiddle Link here,which sorts using the 3rd column. I have integrated it in my code which has 13 columns in the table. But I am not able to find out which part of the code to be changed in the javascript provided,so that only on click of the specific header,the table gets sorted. say, header 3 in this example, ( but I want it 11 in mine) Pls review the js and help me find out which LOC to change/edit

I am using it in MVC. pls help me with the js code below,in finding which lines to be changed.

 var t = new SortableTable(document.getElementById('myTable1'), 100);

function SortableTable(tableEl) {

 this.tbody = tableEl.getElementsByTagName('tbody');
 this.thead = tableEl.getElementsByTagName('thead');
 this.tfoot = tableEl.getElementsByTagName('tfoot');

 this.getInnerText = function (el) {
     if (typeof (el.textContent) != 'undefined') return el.textContent;
     if (typeof (el.innerText) != 'undefined') return el.innerText;
     if (typeof (el.innerHTML) == 'string') return el.innerHTML.replace(/<[^<>]+>/g, '');
 }

 this.getParent = function (el, pTagName) {
     if (el == null) return null;
     else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()) return el;
     else return this.getParent(el.parentNode, pTagName);
 }

 this.sort = function (cell) {

     var column = cell.cellIndex;
     var itm = this.getInnerText(this.tbody[0].rows[1].cells[column]);
     var sortfn = this.sortCaseInsensitive;

     if (itm.match(/\d\d[-]+\d\d[-]+\d\d\d\d/)) sortfn = this.sortDate; // date format mm-dd-yyyy
     if (itm.replace(/^\s+|\s+$/g, "").match(/^[\d\.]+$/)) sortfn = this.sortNumeric;

     this.sortColumnIndex = column;

     var newRows = new Array();
     for (j = 0; j < this.tbody[0].rows.length; j++) {
         newRows[j] = this.tbody[0].rows[j];
     }

     newRows.sort(sortfn);

     if (cell.getAttribute("sortdir") == 'down') {
         newRows.reverse();
         cell.setAttribute('sortdir', 'up');
     } else {
         cell.setAttribute('sortdir', 'down');
     }

     for (i = 0; i < newRows.length; i++) {
         this.tbody[0].appendChild(newRows[i]);
     }

 }

 this.sortCaseInsensitive = function (a, b) {
     aa = thisObject.getInnerText(a.cells[thisObject.sortColumnIndex]).toLowerCase();
     bb = thisObject.getInnerText(b.cells[thisObject.sortColumnIndex]).toLowerCase();
     if (aa == bb) return 0;
     if (aa < bb) return -1;
     return 1;
 }

 this.sortDate = function (a, b) {
     aa = thisObject.getInnerText(a.cells[thisObject.sortColumnIndex]);
     bb = thisObject.getInnerText(b.cells[thisObject.sortColumnIndex]);
     date1 = aa.substr(6, 4) + aa.substr(3, 2) + aa.substr(0, 2);
     date2 = bb.substr(6, 4) + bb.substr(3, 2) + bb.substr(0, 2);
     if (date1 == date2) return 0;
     if (date1 < date2) return -1;
     return 1;
 }

 this.sortNumeric = function (a, b) {
     aa = parseFloat(thisObject.getInnerText(a.cells[thisObject.sortColumnIndex]));
     if (isNaN(aa)) aa = 0;
     bb = parseFloat(thisObject.getInnerText(b.cells[thisObject.sortColumnIndex]));
     if (isNaN(bb)) bb = 0;
     return aa - bb;
 }

 // define variables
 var thisObject = this;
 var sortSection = this.thead;

 // constructor actions
 if (!(this.tbody && this.tbody[0].rows && this.tbody[0].rows.length > 0)) return;

 if (sortSection && sortSection[0].rows && sortSection[0].rows.length > 0) {
     var sortRow = sortSection[0].rows[0];
 } else {
     return;
 }

 for (var i = 0; i < sortRow.cells.length; i++) {
     sortRow.cells[i].sTable = this;
     sortRow.cells[i].onclick = function () {
         this.sTable.sort(this);
         return false;
     }
 }

} Also I need to sort column with decimal places.

Community
  • 1
  • 1
Anjali
  • 73
  • 3
  • 4
  • 13

1 Answers1

0

Your function is sorting only numeric or date value fields so if your column number 11 will have numeric data then it will able to sort otherwise not.

Below code is cause in your function which will find numeric value from whole table and then sorting it.

if (itm.match(/\d\d[-]+\d\d[-]+\d\d\d\d/)) sortfn = this.sortDate; // date format mm-dd-yyyy
     if (itm.replace(/^\s+|\s+$/g, "").match(/^[\d\.]+$/)) sortfn = this.sortNumeric;

I try your code with decimal number too.

Fiddle with decimal number

EDIT: Better way to sort Sorting array of float point numbers

Community
  • 1
  • 1
Sid
  • 801
  • 8
  • 19