Kurze Antwort
new Map([...map].sort((a, b) =>
// Some sort function comparing keys with a[0] b[0] or values with a[1] b[1]
// Be sure to return -1 if lower and, if comparing values, return 0 if equal
))
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:
new Map([...map].sort((a, b) => (a[1] > b[1] && 1) || (a[1] === b[1] ? 0 : -1)))
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), wenn a[0] < b[0]:
new Map([...map].sort((a, b) => a[0] > b[0] ? 1 : -1))
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:
new Map([...map].sort())
... 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 Browserkonsole
const map = new Map([
['2-1', 'foo'],
['0-1', { bar: 'bar' }],
['3-5', () => 'fuz'],
['3-2', [ 'baz' ]]
])
console.log(new Map([...map].sort()))
JEDOCH , es ist keine gute Praxis auf Zwang und stringification wie diese zu verlassen. Sie können Überraschungen bekommen wie:
const map = new Map([
['2', '3,buh?'],
['2,1', 'foo'],
['0,1', { bar: 'bar' }],
['3,5', () => 'fuz'],
['3,2', [ 'baz' ]],
])
// Compares '2,3,buh?' with '2,1,foo'
// Therefore sorts ['2', '3,buh?'] ******AFTER****** ['2,1', 'foo']
console.log('Buh?', new Map([...map].sort()))
// Let's see exactly what each iteration is using as its comparator
for (const iteration of map) {
console.log(iteration.toString())
}
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]und b[0]in der Sortierfunktion wie folgt darauf zu. Beachten Sie, dass wir zurückkehren sollten -1und 1für vorher und nachher, nicht falseoder 0wie bei raw, a[0] > b[0]da dies als gleich behandelt wird:
const map = new Map([
['2,1', 'this is overwritten'],
['2,1', '0,1'],
['0,1', '2,1'],
['2,2', '3,5'],
['3,5', '2,1'],
['2', ',9,9']
])
// For keys, we don't need an equals case, because identical keys overwrite
const sortStringKeys = (a, b) => a[0] > b[0] ? 1 : -1
// For values, we do need an equals case
const sortStringValues = (a, b) => (a[1] > b[1] && 1) || (a[1] === b[1] ? 0 : -1)
console.log('By keys:', new Map([...map].sort(sortStringKeys)))
console.log('By values:', new Map([...map].sort(sortStringValues)))