2013-03-28 41 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

這是我認爲最簡單的方法,它的工作。