2013-03-28 43 views
5

在Javascript中的数组,如果我有一个数组的数组,如下所示:使用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

我如何去排序数组数组?

+5

如果您更改比较函数以说明传递参数是数组的事实,它应该可以工作。 http://jsfiddle.net/SYHr2/ – Rikonator

+0

@Rikonator伟大的解决方案,你可能想张贴作为答案,它似乎工作 – Ian

+0

@Rikonator太棒了!使用不会覆盖自然的.sort方法的超薄功能,为我提供所需的排序功能。如果你把它写成答案,我会接受它。 – ckersch

回答

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

'var len = Math.min(a.length,b.length);'除此之外,禁止样式,你的函数正是我如何编码它。感谢您不要以“功能只有一个退出点”疯狂! – ErikE

1

中提到的脚本替换它。这基本上是做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; 
}); 
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); 
0

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

分。sort(function(a,b){return a-b});

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

这是我认为最简单的方法,它的工作。