2017-01-21 6 views
2

Ich befrage alles, was ich gerade weiß.Warum funktioniert meine Art nicht?

> [ 37, 4, 3, 1, 3, 10, 8, 29, 9, 13, 19, 12, 11, 14, 20, 22, 22, 27, 28, 33, 34 ].sort((a, b) => a > b) 
[19, 34, 3, 1, 3, 10, 8, 29, 9, 13, 4, 12, 11, 14, 20, 22, 22, 27, 28, 33, 37] 

Erwartet es mit 1 beginnen würde, dann 3 (nicht 19 und 34)

Dinge, die ich versucht habe:

[ 37, 4, 3, 1, 3, 10, 8, 29, 9, 13, 19, 12, 11, 14, 20, 22, 22, 27, 28, 33, 34 ].sort(function (a, b) { return a > b }) 

auch:

[ 37, 4, 3, 1, 3, 10, 8, 29, 9, 13, 19, 12, 11, 14, 20, 22, 22, 27, 28, 33, 34 ].sort(function (a, b) { return +a > +b }) 

Antwort

2

Die .sort() Callback-Funktion soll eine numerische Antwort zurück:

  • -1 (oder eine negative Zahl), wenn a < b
  • 0, wenn a == b
  • 1 (oder irgendeine positive Zahl), wenn a>b

Ihr Rückruf gibt ein boolesches Ergebnis zurück, das vom Sortiercode als 0 oder 1 interpretiert wird. Daher wird Ihr Callback für einige Wertepaare widersprüchliche Ergebnisse liefern.

Betrachten Sie als Beispiel das Paar aus Ihrem Array 37 und 4. Wenn der Rückruf mit a mit 37 und b mit 4 aufgerufen wird, gibt Ihr Rückruf true (1) zurück. Das ist zuallererst rückwärts von dem, was es sein sollte.Wenn diese beiden Werte später im Sortierprozess erneut verglichen werden (was durchaus möglich ist), aber in der umgekehrten Reihenfolge, gibt Ihr Callback 0 zurück, was wiederum die falsche Antwort und auch eine andere falsche Antwort ist.

Die einfachste Sache in Ihrem Fall zu tun ist, diesen Vergleich mit einfacher numerischer Subtraktion zu ersetzen:

(a, b) => a - b 
3

Sortieren Zahlen Array, indem der Unterschied in der Vergleichsfunktion zurückgegeben wird.

console.log(
 
    [37, 4, 3, 1, 3, 10, 8, 29, 9, 13, 19, 12, 11, 14, 20, 22, 22, 27, 28, 33, 34].sort((a, b) => a - b) 
 
)

prüfen MDN docs für das Verständnis, was die Rückgabewert bedeutet, wird die folgende von MDN docs genommen:

  1. Wenn compareFunction (a, b) weniger als 0 , sortiere a zu einem niedrigeren Index als b, dh a kommt zuerst.
  2. Wenn compareFunction (a, b) 0 zurückgibt, lassen Sie a und b unverändert, aber in Bezug auf alle anderen Elemente sortiert. Hinweis: Der ECMAscript-Standard garantiert dieses Verhalten nicht, und daher berücksichtigen nicht alle Browser (z. B. Mozilla-Versionen, die mindestens bis 2003 zurückreichen) dies.
  3. Wenn compareFunction (a, b) größer als 0 ist, sortieren Sie b zu einem niedrigeren Index als a. compareFunction (a, b) muss immer den gleichen Wert zurückgeben, wenn ein bestimmtes Paar von Elementen a und b als zwei Argumente angegeben wird. Wenn inkonsistente Ergebnisse zurückgegeben werden, ist die Sortierreihenfolge nicht definiert.
2

zu sortieren numerisch müssen Sie eine Methode hinzufügen, die numerische Art behandelt.

var array=[ 37, 4, 3, 1, 3, 10, 8, 29, 9, 13, 19, 12, 11, 14, 20, 22, 22, 27, 28, 33, 34 ]; 
 
console.log(array.sort(callback)); 
 
function callback(a,b){ 
 
    return a-b; 
 
}

Die Vergleichsfunktion hat die folgende Form:

function compare(a, b) { 
    if (a < b) { 
    return -1; 
    } 
    if (a > b) { 
    return 1; 
    } 
    // a must be equal to b 
    return 0; 
} 
Verwandte Themen