在 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;
}
}
数组看起来像这样:
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'
?
感谢您提供的任何帮助!
最佳答案
sort()
函数的比较回调由排序过程调用并传递数组元素对。您不必告诉任何要比较的元素;排序过程已经知道这一点。
在您的情况下,问题是您本质上需要每列一个排序函数。您可以通过创建一个返回另一个函数的函数来处理这个问题,该函数“知道”要比较哪一列:
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
参数,因此它本质上“知道”如何比较两行。
关于javascript - 使用自定义排序函数在 JavaScript 中对多维数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34977280/