使用Javascript对数组数组进行排序

时间:2013-03-28 15:28:24

标签: javascript sorting numbers

在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]产生{ {1}}

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

5 个答案:

答案 0 :(得分:6)

正如我在评论中所说,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);
};

它首先尝试查找两个数组的公共长度的差异。如果公共长度完全相同,则根据数组长度进行排序。 Here's a working fiddle

答案 1 :(得分:1)

你想要的是运行自然类型。对于比较功能,请将其替换为本文中提到的脚本

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

答案 2 :(得分: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;
});

答案 3 :(得分: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);

答案 4 :(得分:0)

var points = [40,100,1,5,25,10];

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

然后结果是: 1,5,10,25,40,100

这是我认为最简单的方法,它起作用了。