2017-02-07 3 views
2

i wurde gefragt, wie JavaScript-Array Sortierungs-Methode arbeitet, wenn eine individuelle Sortierfunktion wie unten angegeben ist:Confusing Punkt über Array Sortiermethode in Javascript

arr = [1, 5, 122, 12]; 
arr.sort(function (a,b){return a-b;}); 

wenn es akzeptiert nur zwei Argumente a, b (1,5) in "arr", ich weiß, dass Javascript mehr Argumente als die in der Funktion angegebenen erlauben. Aber wie funktioniert die Sortierfunktion, vergleicht sie 1,5 und dann 122,12, speichert das Ergebnis an einer Stelle und führt dann den Vergleich erneut durch.

+0

Es gibt viele verschiedene Möglichkeiten, ein Array wie Quicksort, Mergesort und so weiter zu sortieren. Sie müssen der Sortierfunktion lediglich mitteilen, wie zwei Elemente miteinander verglichen werden. – fafl

+0

Siehe http://stackoverflow.com/questions/1494713/how-does-javascripts-sort-work – NNR

+0

danke alvaro, meine Frage hat einen vollen Fokus auf den Sortieralgorithmus. –

Antwort

0

Es ist in den MDN documentation erläutert:

  • Wenn compareFunction (a, b) kleiner als 0 ist, eine Art mit einem niedrigen Index als B, das heißt ein an erster Stelle.
  • Wenn compareFunction (a, b) 0 zurückgibt, lassen Sie a und b unverändert, aber in Bezug auf alle anderen Elemente sortiert.
  • Wenn compareFunction (a, b) größer als 0 ist, sortieren Sie b zu einem niedrigeren Index als a.

Es gibt also nichts mit mehr als zwei Argumente zu tun.

Wenn Sie fragen, in welcher Reihenfolge es sie vergleicht, liegt es an der Implementierung. Sie können finden sie eine console.log in der Funktion zu tun:

arr = [1, 5, 122, 12]; 
 
arr.sort(function (a,b){console.log('Comparing a:', a, 'and b:', b); return a-b;});

+0

ich weiß das, ich frage mich nur, wie die Sortierfunktion ihr selbst handelt, wenn sie das dritte Argument passiert. –

+0

@ MarouaneEl-anbri ein drittes Argument wird nicht an die Funktion geliefert. In der Spezifikation wird explizit geschrieben "Wenn comparefn nicht undefiniert ist, sollte es eine Funktion sein, die zwei Argumente akzeptiert x und y' – rpadovani

+0

danke rpadovani, ich bekomme es –

2

, wenn eine benutzerdefinierte Sortierfunktion

angegeben Dies ist nicht korrekt. Sie bieten a function to compare items:

arr.sort() 
arr.sort(compareFunction) 

compareFunction

eine Funktion Legt fest, dass die Reihenfolge sortieren definiert. Wenn sie weggelassen wird, wird das Array nach dem Unicode-Codepunkt des jeweiligen Zeichens sortiert, entsprechend der String-Konvertierung jedes Elements.

Der Sortieralgorithmus selbst ist in der nativen Implementierung fest codiert und kann nicht geändert werden. Implementierungen können sogar verschiedene Algorithmen auswählen, je nach Datentypen oder Array-Länge.

Der Grund ist, dass Sie unterschiedliche Bedürfnisse haben:

  • Möglicherweise möchten binäre Sortierung verwenden und machen A von a verschiedenen oder Sie können Spanisch Sortierung verwenden wollen und a identisch á zu machen.

  • Sie können benutzerdefinierte Objekte sortieren:

    [ 
        { 
         city: "Madrid", 
         population: 4000000 
        }, 
        { 
         city: "Cairo", 
         pages: 15000000 
        } 
    ] 
    
  • Oder Sie können Früchte sortieren möchten und pear vor apple :)

jedoch Algorithmus, der Art kommen zu lassen sich (Quicksort usw.) ist ein Implementierungsdetail, das normalerweise für Ihre Geschäftslogik nicht von Bedeutung ist.

+0

danke alvaro für die Klarstellung, –