在JavaScript中对多维数组进行排序。读过其他帖子,但无法弄清楚如何将数组成员传递给自定义排序函数,该函数决定是否对字符串或数字进行排序。 自定义排序功能是这样的:
function colSort(a, b) {
if (sortDown) dValue = 1
else dValue = -1;
if (isNumeric(a[sortIndex])) {
return (b[sortIndex] - a[sortIndex]) * dValue;
} else {
var astring = a[sortIndex].toLowerCase();
var bstring = b[sortIndex].toLowerCase();
if (bstring > astring) return -dValue;
if (bstring < astring) return dValue;
return 0;
}
}
Array看起来像这样:
var qbStats =[
['David Lea', 'GB', 343, 502, 68.3, 4643, 9.2, 45, 6, 122.5],
['Kevin Whyte', 'NO', 440, 622, 70.7, 5087, 8.2, 41, 13, 108.4]
]
应该能够点击列出数组成员的HTML表格中的列标题,以便对点击的列进行升序/降序排序。
我无法弄清楚如何指示成员在点击的索引上排序。
我知道它的开头是:
qbStats.sort(colSort(a,b));
但我不知道如何传递数组成员以对特定索引进行排序。例如:如何告诉它将'GB'
和'NO'
排序为'a'
和'b'
?
感谢您提供任何帮助!
答案 0 :(得分:1)
排序过程调用sort()
函数的比较回调并传递数组元素对。你不必告诉任何要比较的元素;排序过程已经知道了。
在您的情况下,问题是您基本上需要每列的排序功能。您可以通过创建一个返回另一个函数的函数来处理这个函数,这个函数是&#34;知道&#34;要比较的列:
function byColumn(sortIndex) {
return function colSort(a, b) {
if (sortDown) dValue = 1
else dValue = -1;
if (isNumeric(a[sortIndex])) {
return (b[sortIndex] - a[sortIndex]) * dValue;
} else {
var astring = a[sortIndex].toLowerCase();
var bstring = b[sortIndex].toLowerCase();
if (bstring > astring) return -dValue;
if (bstring < astring) return dValue;
return 0;
}
};
}
然后:
qbStats.sort(byColumn(4)); // sort by column 4
byColumn()
函数只是比较器函数的简单包装器。调用它时,它返回排序过程将使用的实际函数。该函数可以访问在创建时传入的sortIndex
参数,因此它本质上是&#34;知道&#34;如何比较两行。
答案 1 :(得分:0)
也许这适合你。该函数返回任何情况下要比较的正确函数。
var qbStats = [['David Lea', 'GB', 343, 502, 68.3, 4643, 9.2, 45, 6, 122.5], ['Kevin Whyte', 'NO', 440, 622, 70.7, 5087, 8.2, 41, 13, 108.4]];
function sort(column, sortOrder, isNumber) {
if (isNumber) {
if (~sortOrder) {
return function (a, b) {
return a[column] - b[column];
}
} else {
return function (a, b) {
return b[column] - a[column];
}
}
} else {
if (~sortOrder) {
return function (a, b) {
return a[column].localeCompare(b[column]);
}
} else {
return function (a, b) {
return b[column].localeCompare(a[column]);
}
}
}
}
qbStats.sort(sort(0, 1, false)); // sort 0th column, ascending by string
document.write('<pre>' + JSON.stringify(qbStats, 0, 4) + '</pre>');
qbStats.sort(sort(2, -1, true)); // sort 2th column, descending by number
document.write('<pre>' + JSON.stringify(qbStats, 0, 4) + '</pre>');