我正在构建一个jQuery表排序脚本。是的,是的,我知道有这样的插件,但在哪里摆脱别人的外套尾巴的乐趣(更不用说完全缺乏学习和理解)?
所以我对alpha类型进行了很好的排序,我现在正在进行数字排序。
如此快速下降和肮脏。我得到列值并将它们推入数组:
var counter = $(".sort tr td:nth-child("+(columnIndex+1)+")").length;
for (i = 1; i <= counter; i++) {
columnValues.push($(".sort tr:eq("+i+") td:eq("+columnIndex+")").text());
}
然后我对它们进行排序:
columnValues.sort(function(a,b){
return a-b
});
然后我检查唯一条目(这主要是为了同名):
$.each(columnValues, function(i, el){
if($.inArray(el, uniqueColumns) === -1) uniqueColumns.push(el);
});
然后我使用数组作为键列表从表中获取数据并推入另一个数组。这就是问题所在。对于名称它可以正常工作,但是数字(即3,30,36)则不然。排序列表从3开始,它看到30和/或36中的3并抓住它。
以下是我的尝试:
for (i = 0; i < counter; i++) {
var key = uniqueColumns[i];
$(".sort tr:contains("+key+") td").each(function(){
rowValues.push($(this).text());
});
}
和
for (i = 0; i < counter; i++) {
var key = uniqueColumns[i];
$(".sort tr td").filter(function(i){
if($(this).text() === key) {
rowValues.push($(this).text());
}
});
}
这是使用第一组代码运行代码的小提琴(它比第二代更好):
更新:
还试过这个(仍然无法正常工作,适用于初始排序,但不适用于后续):
for (i = 0; i < counter; i++) {
var key = uniqueColumns[i];
var found = false;
$(".sort tr:contains("+key+")").filter(function(j){
$(this).children().each(function(){
if ($(this).text() === key) {
found = true;
}
});
$(this).children().each(function(){
if (found) {
rowValues.push($(this).text());
}
});
});
}
答案 0 :(得分:0)
自己想出来。决定采用完全不同的方法。我从表数据中创建了一个多维数组,然后创建了一个适用于数字和alpha数据的自定义排序函数。这是获取数据,对数据进行排序并重写表的函数。
function sort(column) {
var columnIndex = $(column).index(),
rowValues = [];
/* Get Data */
$(".sort tr").not(":first-child").each(function () {
var innerArray = [];
$(this).find('td').each(function () {
innerArray.push($(this).text());
});
rowValues.push(innerArray);
});
/* Sort Data */
rowValues.sort((function(index){
return function(a, b){
if (!isNaN(a[index])) {
a[index] = parseInt(a[index]);
}
if (!isNaN(b[index])) {
b[index] = parseInt(b[index]);
}
return (a[index] === b[index] ? 0 :
(a[index] < b[index] ? -1 : 1));
};
})(columnIndex));
/* Replace Data */
$(".sort tr").not(":first-child").each(function(i){
$(this).find("td").each(function(j){
$(this).replaceWith("<td>"+rowValues[i][j]+"</td>");
});
});
}