Krótka odpowiedź
new Map([...map].sort((a, b) =>
))
Na przykład, porównując ciągi wartości, które mogą być równe, przekazujemy funkcję sortowania, która uzyskuje dostęp do [1] i ma warunek równości, który zwraca 0:
new Map([...map].sort((a, b) => (a[1] > b[1] && 1) || (a[1] === b[1] ? 0 : -1)))
Porównując ciągi kluczy, które nie mogą być równe (identyczne klucze łańcuchowe nadpisałyby się nawzajem), możemy pominąć warunek równości. Jednak nadal powinniśmy jawnie zwracać -1, ponieważ zwrócenie leniwego a[0] > b[0]
niepoprawnie daje fałsz (traktowane jako 0, czyli równe), gdy a[0] < b[0]
:
new Map([...map].sort((a, b) => a[0] > b[0] ? 1 : -1))
Szczegółowo z przykładami
.entries()
W [...map.entries()]
(sugerowane w wielu odpowiedziach) jest zbędne, prawdopodobnie dodając dodatkowy iteracji mapie chyba że optymalizuje silnika JS że z dala dla ciebie.
W prostym przypadku testowym możesz zrobić to, o co chodzi w pytaniu, używając:
new Map([...map].sort())
... który, jeśli wszystkie klucze są ciągami, porównuje spłaszczone i wymuszone ciągi klucz-wartość połączone przecinkami, takie jak '2-1,foo'
i '0-1,[object Object]'
, zwracając nową mapę z nową kolejnością wstawiania:
Uwaga: jeśli widzisz tylko {}
wyjście konsoli SO, spójrz na swoją prawdziwą konsolę przeglądarki
const map = new Map([
['2-1', 'foo'],
['0-1', { bar: 'bar' }],
['3-5', () => 'fuz'],
['3-2', [ 'baz' ]]
])
console.log(new Map([...map].sort()))
JEDNAK nie jest dobrą praktyką poleganie na takim przymusie i ograniczaniu. Możesz otrzymać niespodzianki, takie jak:
const map = new Map([
['2', '3,buh?'],
['2,1', 'foo'],
['0,1', { bar: 'bar' }],
['3,5', () => 'fuz'],
['3,2', [ 'baz' ]],
])
console.log('Buh?', new Map([...map].sort()))
for (const iteration of map) {
console.log(iteration.toString())
}
Takie błędy są naprawdę trudne do debugowania - nie ryzykuj!
Jeśli chcesz, aby posortować na klucze lub wartości, to najlepiej, aby uzyskać do nich dostęp z wyraźnie a[0]
i b[0]
w funkcji sortowania, jak to. Zauważ, że powinniśmy powrócić -1
i 1
przed i po, a nie false
lub 0
jak w przypadku surowego, a[0] > b[0]
ponieważ jest to traktowane jako równe:
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']
])
const sortStringKeys = (a, b) => a[0] > b[0] ? 1 : -1
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)))