Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sort a table fast by its first column with Javascript or jQuery

Tags:

I have a table which is dynamically populated from FullCalendar. The problem is that FullCalendar does not care about its original order.

The table looks like this:

<table id="caltbl">    <thead>        <tr> <th> </th>   <th> Date </th>   <th> hours </th>  ... </tr>    </thead>    <tbody>        <tr> <td class="sortnr">1</td>   <td></td> ... </tr>        <tr> <td class="sortnr">3</td>   <td></td> ... </tr>        <tr> <td class="sortnr">2</td>   <td></td> ... </tr>        <tr> <td class="sortnr">4</td>   <td></td> ... </tr>    </tbody> </table> 

The first of each row contains the number on which the table should be sorted.

I had this code to sort it:

    var rows = $('#caltbl > tbody').children('tr').detach();      for (var counter = 1; counter<=rows.length; counter++) {         $(rows).each(function(index) {             if ($(this).find(".sortnr").text()==counter){                $('#caltbl > tbody:last').append($(this));             }         });     } 

This works fine in Firefox but causes me a major headache in Internet Explorer because there are more than 500 items and it hangs. I could add a setTimeout but that would not fix the real problem. The sorting is slow. What is a faster way to sort this?

Instead of having to start from the <table> html, as I said it gets populated dynamically so I have an Array which contains the html. 1 item per <tr> (unsorted)

like image 886
Stefanvds Avatar asked Sep 26 '11 16:09

Stefanvds


People also ask

How do you sort a table in ascending order in HTML?

Sort Table by Clicking the Headers. Click the headers to sort the table. Click "Name" to sort by names, and "Country" to sort by country. The first time you click, the sorting direction is ascending (A to Z).

How do you sort a column in Javascript?

Here is an example code below, all you need to do is match the ID on the table tag with the ID mentioned in the JS, add sortTable to each column TD you want sortable (make sure you use correct column depth starting at 0) and make sure you code your tables properly, ie. with a thead and tbody.

How do you sort a table in HTML using Javascript?

add a click event to all header ( th ) cells... for the current table , find all rows (except the first)... sort the rows, based on the value of the clicked column... insert the rows back into the table, in the new order.

How do you sort a table by column in HTML?

Adding the "sortable" class to a <table> element provides support for sorting by column value. Clicking the column headers will sort the table rows by that column's value. Tables must use <thead> and <th> tags for sortable functionality to work. The <th> tag defines a header cell in an HTML table.


2 Answers

Fiddle: http://jsfiddle.net/qNwDe/

I've written an efficient, cross-browser method to sort the rows in your table. Multiple JQuery selectors in double loops are causing serious performance issues (as you've noticed), hence I've get rid of JQuery.

An additional advantage of my function is that it doesn't mind missing index numbers. I'm currently referring to the first cell of each row, rather than getting the element by class name. If you want to refer by classname, I will alter my function:

function sortTable(){     var tbl = document.getElementById("caltbl").tBodies[0];     var store = [];     for(var i=0, len=tbl.rows.length; i<len; i++){         var row = tbl.rows[i];         var sortnr = parseFloat(row.cells[0].textContent || row.cells[0].innerText);         if(!isNaN(sortnr)) store.push([sortnr, row]);     }     store.sort(function(x,y){         return x[0] - y[0];     });     for(var i=0, len=store.length; i<len; i++){         tbl.appendChild(store[i][1]);     }     store = null; } 

Call sortTable() whenever you want to sort the table.

like image 140
Rob W Avatar answered Sep 23 '22 02:09

Rob W


Try an approach like this: http://jsfiddle.net/qh6JE/

var rows = $('#caltbl > tbody').children('tr').get(); // creates a JS array of DOM elements rows.sort(function(a, b) {  // use a custom sort function     var anum = parseInt($(a).find(".sortnr").text(), 10);     var bnum = parseInt($(b).find(".sortnr").text(), 10);     return anum-bnum; }); for (var i = 0; i < rows.length; i++) {  // .append() will move them for you     $('#caltbl > tbody').append(rows[i]); } 
like image 32
Blazemonger Avatar answered Sep 23 '22 02:09

Blazemonger