以数字和字典顺序排序多维数组javascript

时间:2016-07-25 05:28:16

标签: javascript arrays algorithm sorting

过去两天我一直在试图找到解决问题的办法,但我无法弄明白。

我需要先按数字排序数组,然后按字典顺序排序。虽然定制a< b函数可以解决第一个,正常的array.sort()可以做第二个。但我不知道如何将它们结合起来。

我有一个与此类似的数组:



var arr = [
    [ '80', '1', '230' ],
    [ '9', '1', '230' ],
    [ 'Ken', '6', '100' ],
    [ 'Dan', '2', '800' ],
    [ 'Tom', '6', '500' ],
    [ 'team10', '2', '222' ],
    [ 'team9', '2', '222' ]
  ];




首先需要根据arr [n] [1]中的数字(最大到最小)对数组进行数值排序。具有相同arr [n] [1]值的结果需要根据arr [n] [2](从最大到最小)以数字方式排序。最后,具有相同值[n] [1]和[n] [2]的结果需要基于arr [n] [0]进行lexigographically排序。

到目前为止我得到的最远的是这种方法:



function sortArr() {
       arr.sort(function(a,b) {
          if (a[1] === b[1]) {
              if (a[2] === b[2]) {
                  return b[0] < a[0];
              }
              return a[2]-b[2];
          }
          return b[1]-a[1]
      });
  }
&#13;
&#13;
&#13;

虽然数字排序适用于此,但词典排序并不适用。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我建议对字符串使用带String#localeCompare的链式方法。

排序顺序:

  • at index 1 desc
  • at index 2 desc
  • 在索引0处
    • 不是数字部分asc
    • nummerical part asc

var arr = [[ '80', '1', '230' ], [ '9', '1', '230' ], [ 'Ken', '6', '100' ], [ 'Dan', '2', '800' ], [ 'Tom', '6', '500' ], [ 'team10', '2', '222' ], [ 'team9', '2', '222' ]];

arr.sort(function (a, b) {
    var aa = a[0].split(/(\d+)/g),
        bb = b[0].split(/(\d+)/g);

    return b[1] - a[1] ||
        b[2] - a[2] ||
        aa[0].localeCompare(bb[0]) || aa[1] - bb[1];
});

console.log(arr);