Ich habe das assoziative Array:
array["sub2"] = 1;
array["sub0"] = -1;
array["sub1"] = 0;
array["sub3"] = 1;
array["sub4"] = 0;
Was ist die eleganteste Art, nach ihren Werten zu sortieren (absteigend), wobei das Ergebnis ein Array mit den jeweiligen Indizes in dieser Reihenfolge wäre:
sub2, sub3, sub1, sub4, sub0
?
javascript
arrays
sorting
associative
John Smith
quelle
quelle
Antworten:
Javascript hat keine "assoziativen Arrays", wie Sie sie sich vorstellen. Stattdessen haben Sie einfach die Möglichkeit, Objekteigenschaften mithilfe einer Array-ähnlichen Syntax (wie in Ihrem Beispiel) festzulegen und die Eigenschaften eines Objekts zu durchlaufen.
Das Ergebnis davon ist, dass es keine Garantie für die Reihenfolge gibt, in der Sie die Eigenschaften durchlaufen, sodass es für sie nichts Vergleichbares gibt . Stattdessen müssen Sie Ihre Objekteigenschaften in ein "echtes" Array konvertieren (was die Reihenfolge garantiert). Hier ist ein Code-Snippet zum Konvertieren eines Objekts in ein Array von zwei Tupeln (Arrays mit zwei Elementen), zum Sortieren wie beschrieben und zum erneuten Durchlaufen:
Möglicherweise ist es natürlicher, dies in eine Funktion zu verpacken, die einen Rückruf entgegennimmt:
quelle
Anstatt Sie in Bezug auf die Semantik eines 'assoziativen Arrays' zu korrigieren, denke ich, dass Sie Folgendes wollen:
Verwenden Sie für wirklich alte Browser stattdessen Folgendes:
Sie speichern ein Objekt (wie Ihr Objekt) und erhalten ein Array der Schlüssel - eh-Eigenschaften - zurück, sortiert nach dem (numerischen) Wert des, eh, der Werte des, eh, -Objekts.
Dies funktioniert nur, wenn Ihre Werte numerisch sind. Tweek das kleine drin
function(a,b)
, um den Sortiermechanismus so zu ändern, dass er aufsteigend arbeitet oder fürstring
Werte arbeitet (zum Beispiel). Links als Übung für den Leser.quelle
Fortsetzung der Diskussion und andere Lösungen unter Wie sortiere ich ein (assoziatives) Array nach Wert? Die beste Lösung (für meinen Fall) ist saml ( siehe unten).
Arrays können nur numerische Indizes haben. Sie müssen dies entweder als Objekt oder als Array von Objekten umschreiben.
Wenn Ihnen die
status.push
Methode gefällt , können Sie sie sortieren mit:quelle
sort()
sie unterschiedlich behandelt werden. Es hat mich eine Stunde lang durcheinander gebracht, bis ich dieses Beispiel gefunden habe: stackoverflow.com/questions/6712034/… ;a.name.toLowerCase() > b.name.toLowerCase()
In JavaScript gibt es wirklich kein "assoziatives Array". Was Sie dort haben, ist nur ein einfaches altes Objekt. Sie funktionieren natürlich ähnlich wie assoziative Arrays, und die Schlüssel sind verfügbar, aber es gibt keine Semantik in Bezug auf die Reihenfolge der Schlüssel.
Sie können Ihr Objekt in ein Array von Objekten (Schlüssel / Wert-Paare) verwandeln und Folgendes sortieren:
Dann würden Sie das mit einer Komparatorfunktion aufrufen.
quelle
Hier ist eine Variation der Antwort von Ben Blank, wenn Sie keine Tupel mögen.
Dies erspart Ihnen einige Zeichen.
quelle
Keine unnötigen Komplikationen erforderlich ...
quelle
var stuff = {"a":1 , "b":3 , "c":0 } sortMapByValue(stuff) [Array[2], Array[2], Array[2]]
Ich benutze $ .each von jquery, aber Sie können es mit einer for-Schleife machen. Eine Verbesserung ist folgende:
Jetzt können Sie es also tun
quelle
Der beste Ansatz für den speziellen Fall hier ist meiner Meinung nach der vorgeschlagene Commonpike . Eine kleine Verbesserung, die ich in modernen Browsern vorschlagen würde, ist:
Dies kann leicht zutreffen und im speziellen Fall hier hervorragend funktionieren, sodass Sie Folgendes tun können:
Außerdem biete ich hier eine "allgemeinere" Funktion, mit der Sie auch in einem größeren Bereich von Situationen sortieren können, und die die gerade vorgeschlagene Verbesserung mit den Ansätzen der Antworten von Ben Blank (Sortieren auch von Zeichenfolgenwerten) und PopeJohnPaulII ( Sortieren nach bestimmten Objektfeldern / Eigenschaften) und lässt Sie entscheiden, ob Sie eine aufsteigende oder absteigende Reihenfolge wünschen, hier ist es:
Sie können die Funktionen testen, indem Sie den folgenden Code ausprobieren:
Wie ich bereits sagte, können Sie sortierte Schlüssel durchlaufen, wenn Sie Dinge erledigen müssen
Zu guter Letzt einige nützliche Verweise auf Object.keys und Array.sort
quelle
Nur damit es da draußen ist und jemand nach Tupel-basierten Sorten sucht. Dadurch wird das erste Element des Objekts im Array mit dem zweiten Element usw. verglichen. dh im folgenden Beispiel wird zuerst mit "a", dann mit "b" usw. verglichen.
OUPUTS
quelle
@ commonpikes Antwort ist "die richtige", aber als er weiter kommentiert ...
Ja ...
Object.keys()
ist viel besser .Aber was ist noch besser ? Duh, es ist soweit
coffeescript
!quelle