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

时间:2016-01-24 15:01:28

标签: javascript arrays sorting

在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'? 感谢您提供任何帮助!

2 个答案:

答案 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>');