2013-03-28 20 views
5

In Javascript zu sortieren, wenn ich ein Array von Arrays habe, wie die folgenden:mit JavaScript eine Reihe von numerischer Arrays

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

Javascript meine Array sortiert, zuerst ersten Eintrag vergleicht, dann die zweiten und so weiter , so dass X.sort() gibt folgendes zurück:

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

das ist, was ich will. Das Problem ist, dass der Vergleichsoperator die Elemente in der Arrays für den Vergleich ist lexikographischer, so [10,2] < [2,2], und zum Beispiel

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

Ich brauche es numerisch zu sortieren, so dass ich eine sortierte Reihe von [[1,1,3],[2,2],[10,2]] bekommen.

Ich habe versucht, eine Vergleichsfunktion von function(a,b){return (a-b) } verwenden, die für das Sortieren einer Reihe von Zahlen funktionieren würde, aber dies nicht gelingt meiner Array richtig zu sortieren, was Sinn macht (glaube ich), weil [10,2] - [1,1,3] Ausbeuten NaN

Wie ich tun über das Sortieren eines Arrays von numerischen Arrays gehen?

+5

Wenn Sie die Vergleichsfunktion ändern, um zu berücksichtigen, dass die übergebenen Argumente Arrays sind, sollte es funktionieren. http://jsfiddle.net/SYHr2/ – Rikonator

+0

@ Rikonator Große Lösung, möchten Sie vielleicht als Antwort zu posten, scheint es zu arbeiten – Ian

+0

@Rikonator Fantastisch! Gibt mir die Sortierfähigkeit, die ich brauche, mit einer schlanken Funktion, die die natürliche .sort-Methode nicht überschreibt. Wenn Sie es als Antwort aufschreiben, akzeptiere ich es. – ckersch

Antwort

6

Wie ich in meinem Kommentar sagte, die sort Funktion muss für die berücksichtigen Tatsache, dass es Arrays als Argumente und keine einfachen Werte empfängt. Sie müssen also entsprechend damit umgehen.

Ich schlage das vor;

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

Zuerst versucht es, nach Unterschieden in der gemeinsamen Länge der beiden Arrays zu suchen. Wenn die gemeinsame Länge genau gleich ist, wird auf der Basis der Array-Länge sortiert. Here's a working fiddle.

+1

'var len = Math.min (a.length, b.length);' Abgesehen davon, ohne Stil, Ihre Funktion ist genau so, wie ich es codiert hätte. Danke, dass du nicht mit dem "einzigen Ausgangspunkt von einer Funktion" gehst! – ErikE

1

Wenn Sie das tun X.sort() aktivieren Sie JavaScript, Ihre individuellen Arrays als Strings zu vergleichen. Es macht im Grunde a.toString().localeCompare(b.toString()). Das ist nicht was du willst.

a.toString() ist in der Regel der gleiche wie a.join(',')

Was würde ich tun, ist jedes Element in dem Arrays vergleicht eine for-Schleife.

Etwas wie folgt aus:

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

Sie müssen zwischen den zwei Arrays sortieren und vergleichen: 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 Punkte = [40, 100, 1, 5, 25, 10];

Punkte.sort (Funktion (a, b) {return a-b});

dann ist das Ergebnis: 1,5,10,25,40,100

Diese einfachste Weg ist, ich denke, es hat funktioniert.

Verwandte Themen