Написал небольшой плагин для сортировки таблиц. Знаю, что есть jqueryTablesorter, но он слишком большой.
Решил выставить на обсуждение.
// TableSorter plug-in
/*
Функция TableSorter.sort сортирует таблицу table по столбцу col, используя при этом функцию fun.
Необязательный аргумент likeNum (default=false) заставляет рассматривать значения ячеек как числа.
*/
var TableSorter = {};
TableSorter.sort = function(table,col,fun,likeNum){
//Метод прототипа для массивов, который переставляет элементы с индексам
//firstIndex и secondIndex местами
Array.prototype.swap = function(firstIndex,secondIndex){
c=this[firstIndex];
this[firstIndex] = this[secondIndex];
this[secondIndex] = c;
}
//Определяем тело таблицы
var tbody = table.tBodies[0];
//Определяем все строки внутри тела таблицы
var trs = tbody.rows;
//Сюда будут помещены значения ячеек сортируемого столбца
var sortedTds = new Array();
//Порядок следования ячеек в сортируемом столбце
var tdsNums = new Array();
for(var i=0;i<trs.length;i++){
//Преобразуем (или не преобразуем) значение ячейки в число в зависимоси от likeNum
var content = likeNum?parseFloat(trs[i].cells[col-1].innerHTML):
trs[i].cells[col-1].innerHTML;
//Заносим значение ячейки в массив
sortedTds.push(content);
//Заносим индекс в массив индексов
tdsNums.push(i);
}
//Сортируем массив sortedTds методом пузырька, при
//этом также переставляя местами элементы в массиве индексов
for(var i=0;i<sortedTds.length;i++){
for(var j=0;j<sortedTds.length-i-1;j++){
if(fun(sortedTds[j],sortedTds[j+1])) {sortedTds.swap(j,j+1);tdsNums.swap(j,j+1)}
}
}
//Создаем контейнер
var container = document.createDocumentFragment();
//Поочередно запихиваем в контейнер строки таблицы,
//вставляя при этом в нее новые строки, чтобы индексы не сбились
for(var i = 0;i<tdsNums.length;i++){
tbody.insertRow(tdsNums[i]+1);
container.appendChild(trs[tdsNums[i]]);
}
//Очищаем тело таблицы.
//Здесь подошел бы innerHTML='', но IE его не поддерживает
while(tbody.rows.length>0){tbody.deleteRow(0);}
//Добавляем отсортированные строки таблицы в пустое тело.
tbody.appendChild(container);
}
Использование:
window.onload = function(){
var table = document.getElementById('sortedTable');
var sortFun = function(a,b){return a>b;}
TableSorter.sort(table,2,sortFun,true);
}
<table id="sortedTable">
<tr><td>34</td><td>45*</td></tr>
<tr><td>543</td><td>32?</td></tr>
<tr><td>76890</td><td>217%</td></tr>
<tr><td>123434</td><td>67.9</td></tr>
<tr><td>4536</td><td>51.9</td></tr>
<tr><td>3455</td><td>430</td></tr>
<tr><td>5667</td><td>4567)))</td></tr>
<tr><td>890</td><td>218(</td></tr>
</table>
Есть предложения по рационализации и улучшению кода?