使用自定义排序函数在 JavaScript 中对多维数组进行排序

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));

但我不知道如何传递要在特定索引上排序的数组成员。例如:我如何告诉它在 'GB''NO' 上排序为 'a''b'
感谢您提供的任何帮助!


sort() 函数的比较回调由排序过程调用并传递数组元素对。您不必告诉任何要比较哪些元素;排序过程已经知道了。

在您的情况下,问题在于您基本上需要每列一个排序函数。您可以通过创建一个返回另一个函数的函数来处理这个问题,该函数"知道"要比较哪一列:

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

byColumn() 函数只是比较器函数的简单package。当它被调用时,它返回排序过程将使用的实际函数。该函数可以访问在其创建时传入的 sortIndex 参数,因此它本质上"知道"如何比较两行。


也许这适合你。该函数在任何情况下都返回要比较的正确函数。

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]