6

在 Javascript 中,如果我有一个数组数组,如下所示:

X = [ [1,2,3,4],
      [1,1,2,3],
      [1,1,3],
      [1,4],
      [2,1,2],
      [2,2]
    ]

Javascript 对我的数组进行排序,首先比较第一个条目,然后是第二个,依此类推,从而X.sort()返回以下内容:

[ [1,1,2,3],
  [1,1,3],
  [1,2,3,4],
  [1,4],
  [2,1,2],
  [2,2]
]

这就是我想要的。问题是用于比较数组中元素的比较运算符是按字典顺序排列的,因此[10,2] < [2,2],例如,

[[10,2],[1,1,3],[2,2]].sort() -> [[1,1,3],[10,2],[2,2]]

我需要它对数字进行排序,以便得到一个排序后的数组[[1,1,3],[2,2],[10,2]]

我尝试使用 的比较函数function(a,b){return (a-b) },该函数可用于对数字数组进行排序,但这无法正确排序我的数组,这是有道理的(我认为),因为[10,2] - [1,1,3]产量NaN

如何对数字数组的数组进行排序?

4

5 回答 5

7

正如我在评论中所说,该sort函数需要考虑到它接收数组作为参数而不是普通值的事实。所以你需要相应地处理它们。

我建议这样做;

var compFunc = function (a, b) {
    var len = a.length > b.length ? b.length : a.length;

    for(var i=0; i<len; ++i) {
        if(a[i] - b[i] !== 0)
            return a[i] - b[i];
    }

    return (a.length - b.length);
};

它首先尝试寻找两个数组的公共长度的差异。如果公共长度完全相同,则根据数组长度进行排序。这是一个工作小提琴

于 2013-03-28T15:48:48.357 回答
1

你想要的是运行一个自然排序。对于您的比较功能,将其替换为本文中提到的脚本

http://my.opera.com/GreyWyvern/blog/show.dml/1671288

于 2013-03-28T15:31:03.107 回答
1

当您这样做时X.sort(),Javascript 会将您的各个数组作为字符串进行比较。基本上是在做a.toString().localeCompare(b.toString())。这不是你想要的。

a.toString()通常与a.join(',')

我要做的是使用 for 循环比较数组中的每个元素。

像这样的东西:

X.sort(function(a,b){
    // Start off assuming values are equal
    var ret = 0;

    // Loop through a
    for(var a_i = 0, a_length = a.length; a_i < a_length; a_i++){
        // If b is shorter than a, it comes first
        if(typeof b[a_i] === 'undefined'){
            ret = 1;
            break;
        }
        // if the element in a and b are *not* the same, then we can sort
        else if(a[a_i] !== b[a_i]){
            ret = a[a_i] - b[a_i];
            break;
        }
    }

    return ret;
});
于 2013-03-28T15:40:43.603 回答
0

您需要在 2 个数组之间进行排序和比较:http: //jsfiddle.net/pXzB6/

var arr = [[10,2],[1,1,3],[2,2]];

arr.sort(function(a,b){
    for(var i=0;i<a.length;i++){
       var item_a = a[i];
       for(var j=0;j<b.length;b++){   
           var item_b = b[j];   
           if(item_a == item_b){
                 continue;
           }
           else{
               return item_a > item_b;
           }
       }
    }

    if(a.length == b.length){
       return 0;
    }
    else{
      return a.length > b.length;
    }
});

console.log(arr);
于 2013-03-28T15:43:01.583 回答
0

变量点 = [40, 100, 1, 5, 25, 10];

points.sort(function(a, b){return ab});

那么结果是:1,5,10,25,40,100

这是我认为最简单的方法,它有效。

于 2016-09-13T02:36:09.747 回答