2013-03-28 11 views
5

w javascript, jeśli mam tablicę tablic, jak poniżej:użyciu JavaScript, aby posortować tablicę tablic numerycznych

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

JavaScript sortuje moją tablicę, porównując pierwszy wpis, potem drugi, i tak dalej tak, że X.sort() zwraca następujący:

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

co jest, co chcę. Problem polega na tym, że operator porównania do porównywania elementów w macierzy jest leksykograficzny, więc [10,2] < [2,2], i, na przykład,

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

muszę go rozwiązać numerycznie, tak aby uzyskać posortowaną tablicę [[1,1,3],[2,2],[10,2]].

Próbowałem przy użyciu funkcji porównawczej function(a,b){return (a-b) }, która będzie działać do sortowania tablicę liczb, ale to nie działa prawidłowo sortować tablicę, która ma sens (chyba) ponieważ [10,2] - [1,1,3] plony NaN

Jak to zrobić posortować tablicę tablic numerycznych?

+5

Jeśli zmienisz funkcję porównywania, aby uwzględnić fakt, że podane argumenty są tablicami, powinna działać. http://jsfiddle.net/SYHr2/ – Rikonator

+0

@Rikonator Świetne rozwiązanie, możesz napisać to jako odpowiedź, wydaje się działać – Ian

+0

@Rikonator Fantastyczne! Daje mi możliwości sortowania, których potrzebuję, z wąską funkcją, która nie zastępuje naturalnej metody .sort. Jeśli napiszesz to jako odpowiedź, zaakceptuję to. – ckersch

Odpowiedz

6

jak powiedziałem w moim komentarzu, funkcja sort musi stanowić dla Fakt, że odbiera tablice jako argumenty, a nie proste wartości. Musisz więc odpowiednio je obsłużyć.

Proponuję to;

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

Najpierw próbuje znaleźć różnice we wspólnej długości dwóch tablic. Jeśli wspólna długość jest dokładnie taka sama, to sortuje się na podstawie długości tablicy. Here's a working fiddle.

+1

'var len = Math.min (a.length, b.length);' Poza tym, styl blokowania, twoja funkcja jest dokładnie taka, jak bym ją zakodował. Dziękuję, że nie pójdziecie z "jedynym punktem wyjścia z funkcji" szaleństwa! – ErikE

1

Kiedy robisz X.sort(), Javascript jest porównanie indywidualnych tablic jako ciągi. W zasadzie robi to a.toString().localeCompare(b.toString()). To nie jest to, czego chcesz.

a.toString() jest zazwyczaj taka sama jak a.join(',')

Co chciałbym zrobić to porównać każdego elementu w macierzy za pomocą pętli for.

coś takiego:

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

Musisz uporządkować i porównać między 2 tablic: 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

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

punktów.sort (funkcja (a, b) {return a-b});

wtedy wynik jest: 1,5,10,25,40,100

Jest to najprostszy sposób myślę, że pracował.

Powiązane problemy