Sorting a multi-dimensional array in JavaScript using a custom sort function
在 JavaScript 中对多维数组进行排序。仔细阅读了其他帖子,但无法弄清楚如何将数组成员传递给自定义排序函数,该函数确定是对字符串还是数字进行排序。
自定义排序功能是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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; } } |
数组看起来像这样:
1 2 3 4 5 6 7 | 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 表中的列标题以对单击的列进行升序/降序排序。
我不知道如何指示要在点击的索引上排序的成员。
我知道它的开头是:
1 | qbStats.sort(colSort(a,b)); |
但我不知道如何传递要在特定索引上排序的数组成员。例如:我如何告诉它在
感谢您提供的任何帮助!
在您的情况下,问题在于您基本上需要每列一个排序函数。您可以通过创建一个返回另一个函数的函数来处理这个问题,该函数"知道"要比较哪一列:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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; } }; } |
然后:
1 | qbStats.sort(byColumn(4)); // sort by column 4 |
也许这适合你。该函数在任何情况下都返回要比较的正确函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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('[cc lang="javascript"]' + JSON.stringify(qbStats, 0, 4) + ' |
\\');
qbStats.sort(sort(2, -1, true)); // 对第 2 列进行排序,按数字降序
document.write(\\'
1 | ' + JSON.stringify(qbStats, 0, 4) + ' |
\\');[/cc]