Ist es möglich, die Einträge eines es6-Kartenobjekts zu sortieren?
var map = new Map();
map.set('2-1', foo);
map.set('0-1', bar);
Ergebnisse in:
map.entries = {
0: {"2-1", foo },
1: {"0-1", bar }
}
Ist es möglich, die Einträge nach ihren Schlüsseln zu sortieren?
map.entries = {
0: {"0-1", bar },
1: {"2-1", foo }
}
javascript
ecmascript-6
Ivan Bacher
quelle
quelle
Antworten:
Laut MDN-Dokumentation:
Sie könnten es so machen:
Denken Sie
.sort()
bei daran, dass das Array nach dem Unicode-Codepunktwert jedes Zeichens sortiert ist, entsprechend der Zeichenfolgenkonvertierung jedes Elements. Also2-1, 0-1, 3-1
wird richtig sortiert.quelle
var mapAsc = new Map([...map.entries()].sort((a,b) => a[0] > b[0]));
Verwenden der Pfeilfunktion (Lambda)2-1,foo
mit0-1,bar
und3-1,baz
(a,b) => a[0] > b[0]
!...
Punkte sind wichtig, sonst versuchen Sie, einen MapIterator zu sortieren1e-9
, die100
in eine sortierte Karte eingefügt werden. Code, der mit Zahlen arbeitet:new Map([...map.entries()].sort((e1, e2) => e1[0] - e2[0]))
Kurze Antwort
Wenn wir beispielsweise Wertzeichenfolgen vergleichen, die gleich sein können, übergeben wir eine Sortierfunktion, die auf [1] zugreift und eine Gleichheitsbedingung hat, die 0 zurückgibt:
Beim Vergleich von Schlüsselzeichenfolgen, die nicht gleich sein können (identische Zeichenfolgenschlüssel würden sich gegenseitig überschreiben), können wir die Gleichheitsbedingung überspringen. Wir sollten jedoch immer noch explizit -1 zurückgeben, da
a[0] > b[0]
die falsche Rückgabe eines Lazy falsch ist (behandelt als 0, dh gleich), wenna[0] < b[0]
:Im Detail mit Beispielen
Das
.entries()
In[...map.entries()]
(in vielen Antworten vorgeschlagen) ist redundant und fügt wahrscheinlich eine zusätzliche Iteration der Karte hinzu, es sei denn, die JS-Engine optimiert dies für Sie.Im einfachen Testfall können Sie tun, was die Frage verlangt:
... die, wenn alle Schlüssel Zeichenfolgen sind, gequetschte und erzwungene durch Kommas verbundene Schlüsselwertzeichenfolgen wie
'2-1,foo'
und vergleichen und'0-1,[object Object]'
eine neue Map mit der neuen Einfügereihenfolge zurückgeben:Hinweis: Wenn Sie nur
{}
in der Konsolenausgabe von SO sehen, schauen Sie in Ihre echte BrowserkonsoleJEDOCH , es ist keine gute Praxis auf Zwang und stringification wie diese zu verlassen. Sie können Überraschungen bekommen wie:
Fehler wie diese sind wirklich schwer zu debuggen - riskieren Sie es nicht!
Wenn Sie nach Schlüsseln oder Werten sortieren möchten, greifen Sie am besten explizit mit
a[0]
undb[0]
in der Sortierfunktion wie folgt darauf zu. Beachten Sie, dass wir zurückkehren sollten-1
und1
für vorher und nachher, nichtfalse
oder0
wie bei raw,a[0] > b[0]
da dies als gleich behandelt wird:quelle
In
Map
ein Array konvertieren mitArray.from
, Array sortieren, zurück konvertieren inMap
zquelle
[...map.values()].sort()
nicht für mich arbeiten, aberArray.from(map.values()).sort()
tatDie Idee ist, die Schlüssel Ihrer Karte in ein Array zu extrahieren. Sortieren Sie dieses Array. Durchlaufen Sie dann dieses sortierte Array, holen Sie das Wertepaar aus der unsortierten Karte und fügen Sie sie in eine neue Karte ein. Die neue Karte wird in sortierter Reihenfolge angezeigt. Der folgende Code ist die Implementierung:
quelle
unsortedMap.keys()
. Sollte auchkeys.sort().map...
seinkeys.sort().forEach...
.Sie können in ein Array konvertieren und Array-Soring-Methoden darauf aufrufen:
quelle
Leider nicht wirklich in ES6 implementiert. Sie haben diese Funktion mit OrderedMap.sort () von ImmutableJS oder _.sortBy () von Lodash.
quelle
Eine Möglichkeit besteht darin, das Eintragsarray abzurufen, zu sortieren und dann eine neue Karte mit dem sortierten Array zu erstellen:
Wenn Sie jedoch kein neues Objekt erstellen möchten, sondern an demselben arbeiten möchten, können Sie Folgendes tun:
quelle
Das folgende Snippet sortiert die angegebene Karte nach ihren Schlüsseln und ordnet die Schlüssel erneut Schlüsselwertobjekten zu. Ich habe die Funktion localeCompare verwendet, da meine Map string-> string object map war.
Ergebnis:
[{t:'tt'}, {x:'xx'}, {y: 'yy'}];
quelle
Soweit ich sehe, ist es derzeit nicht möglich, eine Karte richtig zu sortieren.
Die anderen Lösungen, bei denen die Karte in ein Array konvertiert und auf diese Weise sortiert wird, weisen den folgenden Fehler auf:
Die Sortierung erstellt ein neues Objekt und alle anderen Zeiger auf das unsortierte Objekt werden beschädigt.
quelle
2 Stunden für Details.
Beachten Sie, dass die Antwort auf die Frage bereits unter https://stackoverflow.com/a/31159284/984471 gegeben ist
Die Frage enthält jedoch Schlüssel, die nicht üblich sind.
Im Folgenden finden Sie ein klares und allgemeines Beispiel mit Erläuterungen, das mehr Klarheit bietet:
.
Hoffentlich hilft das.
quelle
Vielleicht ein realistischeres Beispiel dafür, wie man ein Kartenobjekt nicht sortiert, sondern die Sortierung im Voraus vorbereitet, bevor die Karte erstellt wird. Die Syntax wird tatsächlich ziemlich kompakt, wenn Sie es so machen. Sie können die Sortierung vor der Map-Funktion wie folgt mit einer Sortierfunktion vor der Map anwenden (Beispiel aus einer React-App, an der ich mit JSX-Syntax arbeite)
Markieren Sie, dass ich hier eine Sortierfunktion mit einer Pfeilfunktion definiere, die -1 zurückgibt, wenn sie kleiner und 0 ist, andernfalls sortiert nach einer Eigenschaft der Javascript-Objekte in dem Array, das ich von einer API erhalte.
quelle
quelle