Der Versuch, den höchsten und niedrigsten Wert aus einem Array zu erhalten, von dem ich weiß, dass es nur Ganzzahlen enthält, scheint schwieriger zu sein, als ich dachte.
var numArray = [140000, 104, 99];
numArray = numArray.sort();
alert(numArray)
Ich würde erwarten, dass sich das zeigt 99, 104, 140000
. Stattdessen zeigt es 104, 140000, 99
. Es scheint also, dass die Sortierung die Werte als Zeichenfolgen behandelt.
Gibt es eine Möglichkeit, die Sortierfunktion dazu zu bringen, tatsächlich nach ganzzahligen Werten zu sortieren?
javascript
arrays
sorting
numbers
Peirix
quelle
quelle
NaN
. Es wäre schön, eine hochrangige Antwort zu sehen, die sich damit befasstNaN
.Antworten:
Standardmäßig sortiert die Sortiermethode Elemente alphabetisch. Um numerisch zu sortieren, fügen Sie einfach eine neue Methode hinzu, die numerische Sortierungen verarbeitet (sortNumber, siehe unten) -
In ES6 können Sie dies mit Pfeilfunktionen vereinfachen:
Dokumentation:
Mozilla
Array.prototype.sort()
empfiehlt diese Vergleichsfunktion für Arrays, die weder Infinity noch NaN enthalten. (WeilInf - Inf
NaN ist, nicht 0).Auch Beispiele zum Sortieren von Objekten nach Schlüsseln.
quelle
numberArray.sort((a, b) => (a - b));
Yay! Ich denke, das ist nah an der Out-of-the-Box-Methode. Hinweis: Überprüfen Sie, ob Ihre JS-Engine Pfeilfunktionen unterstützt.Aufbauend auf all den oben genannten Antworten können sie auch in einer Zeile wie folgt ausgeführt werden:
quelle
var arr = [140000, 104, 99].sort(function(a,b) { return a-b; });
. Oder kompakter, in ES6let arr = [140000, 104, 99].sort((a,b) => a-b);
function
und einreturn
, sind aber nicht wirklich mit der wahren Zweck des Pfeils Funktion vorbeithis
. Dieser Code impliziert, dass ein gewisserthis
Kontext passiert, aber nicht. Verwirrend für andere Entwickler, Ihren Code zu lesen, nur um ein paar Zeichen zu sparen. Verlassen Sie sich nicht auf Nebenwirkungen - Code mit Zweck!this
in die Funktion übergeht, aber das ist nicht wahr. Es wird tatsächlich vernachlässigt, einthis
und diearguments
Variable zu erstellen , die normalerweise die übergeordneten Variablen überschreiben. Der einzige Grund, den Siethis
innerhalb einer Pfeilfunktion verwenden können, ist das lexikalische Scoping.array.sort führt standardmäßig eine lexikografische Sortierung durch. Für eine numerische Sortierung stellen Sie Ihre eigene Funktion bereit. Hier ist ein einfaches Beispiel:
Beachten Sie auch, dass die Sortierung "an Ort und Stelle" funktioniert und die Zuweisung nicht erforderlich ist.
quelle
Diese Antwort ist auf einige der vorhandenen Antworten gleichwertig, aber ECMAScript 6 Pfeil Funktionen bieten eine wesentlich kompaktere Syntax , die uns eine Inline - Sortierfunktion , ohne dabei die Lesbarkeit definieren können:
Es wird heute in den meisten Browsern unterstützt .
quelle
objArray=objArray.sort((a,b)=>a.numProperty - b.numProperty);
objArray=objArray.sort((a,b)=>a.strProperty.localeCompare(b.strProperty));
Ich bin überrascht, warum jeder empfiehlt, eine Komparatorfunktion zu übergeben
sort()
, was das Sortieren sehr langsam macht!Um Zahlen zu sortieren, erstellen Sie einfach ein TypedArray :
quelle
Der Grund, warum sich die Sortierfunktion so seltsam verhält
Aus der Dokumentation :
Wenn Sie die Unicode-Punktwerte des Arrays drucken , wird dies deutlich.
Dies gibt zurück: "49, 49, 57".
Da 140000 und 104 dieselben Werte (49) zurückgegeben haben, wird der erste Index abgeschnitten und erneut überprüft:
Wenn wir das sortieren, erhalten wir:
also kommt 104 vor 140000.
Das Endergebnis wird also sein:
104, 140000, 99
Fazit:
sort()
sortiert, indem nur der erste Index der Zahlen betrachtet wird.sort()
Es ist egal, ob eine ganze Zahl größer als eine andere ist, sie vergleicht den Wert des Unicodes der Ziffern, und wenn zwei gleiche Unicode-Werte vorhanden sind, prüft sie, ob es eine nächste Ziffer gibt, und vergleicht sie ebenfalls.Um richtig zu sortieren, müssen Sie eine Vergleichsfunktion übergeben,
sort()
wie hier erläutert .quelle
Ich bin mit aks einverstanden, aber anstatt zu verwenden
Du solltest benutzen
quelle
>
und<
vergleichen immer noch a und b als Strings.In der neuen ES6-Welt ist es viel einfacher, eine Sortierung durchzuführen
Das ist alles was du brauchst :)
quelle
In JavaScript besteht das Standardverhalten der sort () -Methode darin, Werte in einem Array alphabetisch zu sortieren.
Um nach Zahlen zu sortieren, müssen Sie eine numerische Sortierfunktion definieren (was sehr einfach ist):
quelle
Array.prototype.sort () ist die Methode zum Sortieren von Arrays, aber es gibt einige Probleme, die wir beachten müssen.
Die Sortierreihenfolge ist standardmäßig lexikografisch und nicht numerisch, unabhängig von den Wertetypen im Array. Selbst wenn das Array nur aus Zahlen besteht, werden alle Werte in Zeichenfolgen konvertiert und lexikografisch sortiert.
Müssen wir also die Methode sort () und reverse () wie unten anpassen?
Weitergeleitete URL
Zum Sortieren von Zahlen innerhalb des Arrays
Zum Umkehren von Zahlen innerhalb des Arrays
Weitergeleitete URL
quelle
Die Frage wurde bereits beantwortet, der kürzeste Weg ist die Verwendung der
sort()
Methode. Wenn Sie jedoch nach mehr Möglichkeiten suchen, um Ihre Zahlenreihen zu sortieren, und Sie auch Zyklen lieben, überprüfen Sie FolgendesSortieren durch Einfügen
Aufsteigend:
Absteigend:
Auswahlsortierung:
Aufsteigend:
Absteigend:
Habe Spaß
quelle
sort()
auf einem TypedArray wie diese Antwort suggeriert . Sicherlich sind sie für mittlere bis große Arrays nicht schneller, da es sich um O (n ^ 2) -Algorithmen handelt.Die folgende Funktion 'numerisch' dient in vielen Fällen dazu, ein Array von Zahlen numerisch zu sortieren, wenn sie als Rückruffunktion bereitgestellt wird:
In einigen seltenen Fällen, in denen das Array sehr große und negative Zahlen enthält, kann ein Überlauffehler auftreten, da das Ergebnis von ab kleiner wird als die kleinste Zahl, mit der JavaScript umgehen kann.
Eine bessere Art, numerische Funktionen zu schreiben, ist also wie folgt:
quelle
DBL_MIN - DBL_MAX
läuft über), aber ein Unterlauf ist nicht möglich. Durch eine katastrophale Stornierung wird das Ergebnis ungenau und verliert die meisten seiner "signifikanten Ziffern", ist jedocha-b
immer ungleich Null und hat das richtige Vorzeichen für a! = B.Undefiniert, Null und NaN behandeln: Null verhält sich wie 0, NaN und Undefiniert gehen zu Ende.
quelle
Nur für ein normales Array von Elementwerten:
Für eine Reihe von Objekten:
quelle
Meine persönliche Lieblingsform dieser Funktion ermöglicht einen Parameter für Aufsteigend oder Absteigend:
Verwendung so einfach wie:
jsFiddle
Oder Code Snippet Beispiel hier!
.smartSort ('asc' | 'desc')
Viel Spaß mit einer Sortiermethode, die ein Array mit mehreren Elementen sortiert! Behandelt derzeit nicht "assoziativ" (auch bekannt als String-Schlüssel), aber alle Arten von Werten! Es werden nicht nur die mehreren Werte
asc
oder sortiertdesc
entsprechend, sondern behält auch die konstante "Position" der "Wertegruppen" bei. Mit anderen Worten; Ints sind immer zuerst, dann kommen Strings, dann Arrays (ja, ich mache das mehrdimensional!), dann Objekte (ungefiltert, Element, Datum) und schließlich undefinierte und Nullen!"Warum?" du fragst. Warum nicht!
Jetzt kommt in 2 Geschmacksrichtungen! Der erste erfordert neuere Browser
Object.defineProperty
, um die Methode zumArray.protoype
Objekt hinzuzufügen . Dies ermöglicht eine einfache natürliche Verwendung, wie zmyArray.smartSort('a')
. Wenn Sie für ältere Browser implementieren müssen oder native Objekte einfach nicht ändern möchten, scrollen Sie nach unten zur Version " Nur Methode" .jsFiddle Array.prototype.smartSort ('asc | desc')
Die Bedienung ist einfach! Machen Sie zuerst ein verrücktes Array wie:
Dann sortiere es einfach!
Nur Methode
Wie oben, nur als einfache Methode!
Verwenden:
jsFiddle-Methode smartSort (Array, "asc | desc")
quelle
Versuchen Sie diesen Code:
HTML:
JavaScript-Code:
quelle
Versuchen Sie diesen Code wie folgt
quelle
quelle
Obwohl dies in JavaScript nicht erforderlich ist, können Sie es verwenden, wenn Sie möchten , dass -1, 0 oder 1 strikt zurückgegeben wird (ähnlich wie der Raumschiffoperator in PHP funktioniert) .
sort()
compareFunction
Math.sign()
Das
compareFunction
Folgende gibt streng -1, 0 oder 1 zurück:quelle
Dies ist die bereits vorgeschlagene und akzeptierte Lösung als Methode für den Array-Prototyp:
quelle
Als Sortiermethode werden Array-Elemente in Zeichenfolgen konvertiert. Im Folgenden funktioniert es also auch gut mit Dezimalzahlen mit Array-Elementen.
Und gibt Ihnen das erwartete Ergebnis.
quelle
Überschreiben der Sortiermethode.
quelle
Die Standardsortierfunktion ist Sortieren in Wörterbuchreihenfolge:
Das obige ist nicht der Fall, den wir für Zahlen wollen. Wenn Sie also Ganzzahlen haben und die Standardsortierfunktion nicht funktioniert (weil sie in Wörterbuchreihenfolge sortiert), müssen Sie Ihre eigene Funktion implementieren:
Ich hoffe, Sie haben eine Frage, wie es funktioniert? Wenn wir hier eine Methode in Sortierfunktion bereitstellen, werden jedes Mal zwei Zahlen übergeben, und wenn die Zahl zurückgegeben wird
Indem Sie dies für alle Zahlen befolgen, sortieren Sie das Array der Ganzzahl.
Wenn Sie ES6 verwenden, schreiben Sie eine Pfeilfunktion:
quelle
Hier ist meine Sortier-Array-Funktion in der Utils-Bibliothek:
quelle
a-b
sollte stattdessen verwendet werden. (Sie können Lust bekommen und eine machenNumber(a>b)-0.5
, aber das ist immer noch keine stabile Sorte).