У меня есть таблица с большим количеством строк, которая не подходит для подкачки. Строки в этой таблице можно отсортировать, щелкнув заголовок столбца, который запускает алгоритм сортировки на стороне клиента на основе http://www.exforsys.com/tutorials/jquery/jquery-basic-alphabetical-sorting.html Функция динамически добавляет свойство «expando» к каждой строке, тем самым кэшируя предварительную сортировку ключа:
row.sortKey = $(row).children('td').eq(column).text().toUpperCase();
Как видите, значения свойств просто устанавливаются на содержимое столбца, по которому щелкнули, и они отбрасываются (обнуляются) после завершения сортировки. Производительность на самом деле на удивление хорошая - но столбцы, содержащие больше текста, сортируются медленнее.
Поскольку сортировка выполняется только для того, чтобы пользователю было легче находить строки, которые они ищут, я решил, что можно ускорить процесс, обрезая значения ключей с помощью substr (0,7) или чего-то еще ( восемь символов должны обеспечить более чем достаточную точность). Тем не менее, я обнаружил, что выполнение substr () связано с большими затратами производительности, чем с сохранением, и, в случае чего, сортировка замедляется.
Кто-нибудь знает какие-либо (другие) оптимизации, которые можно применить к этому методу?
Вот более полный пример:
var rows = $table.find('tbody > tr').get();
$.each(rows, function(index, row) {
row.sortKey = $(row).children('td').eq(column).text().toUpperCase()
})
rows.sort(function(a, b) {
if (a.sortKey < b.sortKey) return -1
if (a.sortKey > b.sortKey) return 1
return 0
})
$.each(rows, function(index, row) {
$table.children('tbody').append(row)
row.sortKey = null
})
РЕДАКТИРОВАТЬ: Вот окончательная версия моего кода, включающая многие из оптимизаций, представленных в ответах ниже:
$('table.sortable').each(function() {
var $table = $(this);
var storage = new Array();
var rows = $table.find('tbody > tr').get();
$('th', $table).each(function(column) {
$(this).click(function() {
var colIndex = this.cellIndex;
for(i=0;i<rows.length;i++) {
rows[i].sortKey = $(rows[i].childNodes[colIndex]).text().toUpperCase();
}
rows.sort(function(a, b) {
if (a.sortKey < b.sortKey) return -1;
if (a.sortKey > b.sortKey) return 1;
return 0;
});
for(i=0;i<rows.length;i++) {
storage.push(rows[i]);
rows[i].sortKey = null;
}
$table.children('tbody').append(storage);
});
});
});