【问题标题】:sorting multidimensional array numerically and lexicographically javascript按数字和字典顺序对多维数组进行排序 javascript
【发布时间】:2016-07-25 05:28:15
【问题描述】:

在过去的 2 天里,我一直在想办法解决这个问题,但我想不通。

我需要先对数组进行数字排序,然后再按字典顺序排序。虽然自定义 a

我有一个类似的数组:

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] 按字典顺序排序。

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

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

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

【问题讨论】:

    标签: javascript arrays algorithm sorting


    【解决方案1】:

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

    排序顺序:

    • 在索引 1 desc 处
    • 在索引 2 处
    • 在索引 0
      • 不是数字部分 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);

    【讨论】:

    • 谢谢妮娜。同样的问题。如果将原始数组中的 team10 和 team9 交换并运行代码,它们将无法正确排序。
    • 这是因为1 &lt; 9 你必须解析数字并比较它们,而不是按字符比较
    猜你喜欢
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多