Ранее я писал эффективный алгоритм сортировки таблиц ( ответ ). Я настроил функцию для этого случая:
function sortTable(){
var tbl = document.getElementById("myTable").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[2].textContent || row.cells[2].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;
}
Чтобы отсортировать таблицу, используйте `sortTable ();
Пояснение к коду:
- Создаются две переменные: HTMLTableSectionElement
tbl
и Массив store
.
- Цикл проходит по всем элементам tBody (= строки) и помещает новый массив в
store
, состоящий из двух элементов: [sortnr, row]
.
sortnr
содержит числовое значение второй ячейки строки, которая используется для функции сортировки (взгляд в будущее)
row
- это ссылка на HTMLTableRowElement , используемая позже для перемещения строк.
store.sort(..)
сортирует массив store
в соответствии с sortnr
(как определено выше, # 2 этого объяснения).
- Цикл проходит по отсортированному массиву и добавляет строки в конец таблицы (
tbl.appendChild
перемещает узел из предыдущего местоположения)
Обратите внимание, что элементы, которые не имеют действительного номера в 3-м столбце (индекс ячейки 2), вообще не перемещаются. Они остаются наверху стола.
Если вы хотите, чтобы неверные строки располагались в конце, используйте:
for(var i=store.length-1; i>=0; i--){
tbl.insertBefore(store[i][1], tbl.rows[0]);
}
Вопрос от Ройи Намира ( в комментариях )
ты человек. просто еще один вопрос: вы написали 'tbl.appendChild
перемещает узел из предыдущего местоположения ', и я сам себе
что действие - это appendChild - но за кулисами оно перемещается (!)
элемент. Я читал об этом, и они сказали, что если это тот же объект
затем он переехал. но откуда он знает, что это тот же объект? он
не имеет идентификатора или что-то, что можно распознать ...
Ответ :
(Пример из реальной жизни:) Скажем, вы видите яблоко, лежащее на столе. Если вы хотите, чтобы это же яблоко было на полу, что бы вы сделали? возьмите яблоко и положите его на пол .
То же самое относится и к appendChild
: когда вы запрашиваете добавление узла, механизм сценариев хочет разместить узел, который нужно поместить в дерево. Следовательно, предыдущий узел будет удален, потому что " appendChild
не не копирует узлов. "
Для копирования узлов существует функция element.cloneNode()
.