2016-07-25 70 views
2

在过去的2天里,我一直在打破我的大脑,试图找到问题的解决方案,但我无法弄清楚。按照数字和按字母顺序排列多维数组javascript

我需要首先数字排序数组,然后按字典顺序排列数组。虽然一个定制的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]按照字母顺序排序。

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

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

虽然数值排序与这个作品中,辞书排序不会。任何帮助,将不胜感激。

回答

1

我建议对字符串使用链接方式String#localeCompare

排序:

  • 索引1个递减
  • 在索引2降序
  • 在索引0处
    • 不nummerical部分ASC
    • nummerical部分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);

+0

谢谢尼娜。同样的问题。如果您在原始数组中切换team10和team9并运行代码,则它们将不会正确排序。 – Falk

+0

这是因为'1 <9'你必须解析数字并比较它们,而不是每个字符比较 – nidomiro