Resposta curta
new Map([...map].sort((a, b) =>
))
Por exemplo, comparando strings de valor, que podem ser iguais, passamos uma função de classificação que acessa [1] e tem uma condição de igual que retorna 0:
new Map([...map].sort((a, b) => (a[1] > b[1] && 1) || (a[1] === b[1] ? 0 : -1)))
Comparando strings de chave, que não podem ser iguais (chaves de string idênticas se sobrescreveriam), podemos pular a condição de igual. No entanto, ainda devemos retornar explicitamente -1, porque retornar um preguiçoso a[0] > b[0]
incorretamente resulta em falso (tratado como 0, ou seja, igual) quando a[0] < b[0]
:
new Map([...map].sort((a, b) => a[0] > b[0] ? 1 : -1))
Em detalhes com exemplos
O .entries()
in [...map.entries()]
(sugerido em muitas respostas) é redundante, provavelmente adicionando uma iteração extra do mapa, a menos que o mecanismo JS otimize isso para você.
No caso de teste simples, você pode fazer o que a pergunta pede com:
new Map([...map].sort())
... que, se as chaves forem todas strings, compara strings de valores-chave unidos por vírgulas e comprimidas como '2-1,foo'
e '0-1,[object Object]'
, retornando um novo Mapa com o novo pedido de inserção:
Nota: se você vir apenas {}
na saída do console do SO, olhe no console do seu navegador real
const map = new Map([
['2-1', 'foo'],
['0-1', { bar: 'bar' }],
['3-5', () => 'fuz'],
['3-2', [ 'baz' ]]
])
console.log(new Map([...map].sort()))
NO ENTANTO , não é uma boa prática confiar em coerção e estringificação como esta. Você pode obter surpresas como:
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())
}
Bugs como esse são realmente difíceis de depurar - não se arrisque!
Se você deseja classificar as chaves ou valores, é melhor acessá-los explicitamente com a[0]
e b[0]
na função de classificação, como este. Observe que devemos retornar -1
e 1
para antes e depois, não false
ou 0
como raw a[0] > b[0]
porque isso é tratado como igual:
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)))