сортировка строк таблицы
Доброго времени уважаемым гуру javascript'а. Что-то я никак не врублюсь как вывести после сортировки строк таблицы. Вроде всё понятно - загоняю строки в массив, потом его
массив.sort. А как потом отобразить? |
atanov,
appendChild |
|
Попробую эту тему оживить.
Скорее всего руки кривые, вряд ли sort работает неправильно, но...
function sorttable (e){
var tbody = document.getElementsByTagName('tbody')[1];
var rowsArray = [].slice.call(tbody.rows);
var compare;
compare = function(rowA, rowB) {
return rowA.cells[2].textContent > rowB.cells[2].textContent;}
rowsArray.sort(compare);
alltable.removeChild(tbody);
for (var i = 0; i < rowsArray.length; i++) {
tbody.appendChild(rowsArray[i]);
}
alltable.appendChild(tbody);
}
этот код вроде должен сортировать строки по строковому значению 3-й ячейки. Сортирует странно - скажем значения на латинскую букву 'A' идут правильно, потом бац идёт несколько строк на 'C', 'S' и т.д. тоже в виде блоков. Какой-то закономерности не обнаружил. Сижу чешу репу, подозрение падает на return: rowA.cells[2].textContent > rowB.cells[2].textContent; На дурака смотрел alert'ом: sort пары берёт, правда как попало (ну да, конечно ни как попало; знаю, что это фича sort в javascript). А вот как проверить правильность сортировки каждого шага, мож чё и увижу? |
atanov,
в compare напишите полноценный вариант условий |
рони,
Не врубаюсь, а чё туда добавить-то? Вроде там только латинские букавы... Или я не прав, что этого: rowA.cells[2].textContent > rowB.cells[2].textContent; недостаточно? |
atanov,
свой-порядок-сортировки |
Сортировка строк по индексу ячейки (возрастание/убывание)
atanov,
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
</head>
<body>
<table width="400" id="alltable" >
<thead>
<tr>
<th>Title 1</th>
<th>Title 2</th>
<th>Title 3</th>
</tr>
</thead>
<tbody>
<tr>
<td>Cell 1.1</td>
<td>B</td>
<td>B</td>
</tr>
<tr>
<td>Cell 2.1</td>
<td>C</td>
<td>C</td>
</tr>
<tr>
<td>Cell 3.1</td>
<td>A</td>
<td>A</td>
</tr>
</tbody>
</table>
<script>
function sorttable(table, index, up) {
var tbody = table.querySelector("tbody");
var rowsArray = [].slice.call(tbody.rows);
var compare = function compareNumeric(a, b) {
a = a.cells[index].textContent.trim();
b = b.cells[index].textContent.trim();
if (a > b) {
return up ? 1 : -1;
}
if (a < b) {
return up ? -1 : 1;
}
};
var temp = document.createDocumentFragment();
rowsArray.sort(compare).forEach(function(a) {
temp.appendChild(a);
});
tbody.appendChild(temp);
}
;
var table = document.querySelector("#alltable");
sorttable (table, 2,true)
</script>
</body>
</html>
|
рони,
Спасибо большое. Но наверное я неправильно объяснил. У меня не цифры, а текст латиницей. Ведь Ваш код и код по ссылке именно с цифрами оперируют? Ещё, для самообразования хотел помучить - у Вас есть укороченные записи (который я никак не могу заставить себя выучить), можно разжевать для нуба, что они возвращают из функции:
if (a > b) {
return up ? 1 : -1;
}
if (a < b) {
return up ? -1 : 1;
}
В довесок - Вы любитель обращаться к элементу DOM через querySelector, вот так:
var tbody = table.querySelector("tbody");
Есть ли рациональное объяснение почему так лучше, чем обращение по id? Ну и напоследок - восхищение использованием createDocumentFragment()! |
Цитата:
что они возвращают из функции 1 или -1 или 0 если up == true и -1, 1, 0 если up == false или не указан. вариант использования sorttable (table, 2,true) // сортировка по возрастанию содержимого третьей ячейки sorttable (table, 2) или sorttable (table, 2,false) // сортировка по убыванию содержимого третьей ячейки document.getElementById() быстрее querySelector, но id редко когда действительно необходимо. |
| Часовой пояс GMT +3, время: 19:56. |