我有一个拥有大量行的表格,不适合分页。这个表格中的行可以通过点击列标题进行排序,触发基于http://www.exforsys.com/tutorials/jquery/jquery-basic-alphabetical-sorting.html的客户端排序算法。该函数会为每一行动态添加一个“expando”属性,从而缓存键的预排序状态:
正如您所看到的,属性值只是简单地设置为点击列的内容,排序完成后它们被丢弃(置空)。实际上,性能表现出奇的好 - 但包含更多文本的列似乎排序较慢。
由于排序仅是为了使用户更容易找到他们正在查找的行,我想可以通过使用substr(0,7)或类似方法来裁剪键值以加快速度(八个字符应该提供足够的精度)。然而,我发现进行substr()会产生更多的性能成本,而不是节省,如果有什么问题,它会使排序变慢。
有谁知道可以应用于此方法的任何(其他)优化吗?
这是一个更完整的示例:
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);
});
});
});