Réponse courte
new Map([...map].sort((a, b) =>
))
Par exemple, en comparant des chaînes de valeurs, qui peuvent être égales, nous transmettons une fonction de tri qui accède à [1] et a une condition d'égalité qui renvoie 0:
new Map([...map].sort((a, b) => (a[1] > b[1] && 1) || (a[1] === b[1] ? 0 : -1)))
En comparant des chaînes de clé, qui ne peuvent pas être égales (des clés de chaîne identiques se remplaceraient), nous pouvons ignorer la condition d'égalité. Cependant, nous devrions toujours retourner explicitement -1, car le retour d'un paresseux a[0] > b[0]
donne incorrectement false (traité comme 0, c'est-à-dire égal) lorsque a[0] < b[0]
:
new Map([...map].sort((a, b) => a[0] > b[0] ? 1 : -1))
En détail avec des exemples
Le .entries()
dans[...map.entries()]
(suggéré dans de nombreuses réponses) est redondant, ajoutant probablement une itération supplémentaire de la carte à moins que le moteur JS ne l'optimise pour vous.
Dans le cas de test simple, vous pouvez faire ce que la question demande avec:
new Map([...map].sort())
... qui, si les clés sont toutes des chaînes, compare les chaînes de valeur-clé jointes par des virgules écrasées et forcées comme '2-1,foo'
et '0-1,[object Object]'
, en renvoyant une nouvelle carte avec le nouvel ordre d'insertion:
Remarque: si vous ne voyez que {}
dans la sortie de la console de SO, regardez dans la console de votre navigateur réel
const map = new Map([
['2-1', 'foo'],
['0-1', { bar: 'bar' }],
['3-5', () => 'fuz'],
['3-2', [ 'baz' ]]
])
console.log(new Map([...map].sort()))
CEPENDANT , ce n'est pas une bonne pratique de s'appuyer sur la coercition et la stringification comme celle-ci. Vous pouvez avoir des surprises comme:
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())
}
Des bogues comme celui-ci sont vraiment difficiles à déboguer - ne le risquez pas!
Si vous souhaitez trier sur des clés ou des valeurs, il est préférable d'y accéder explicitement avec a[0]
et b[0]
dans la fonction de tri, comme ceci. Notez que nous devrions retourner -1
et 1
pour avant et après, pas false
ou 0
comme avec raw a[0] > b[0]
car cela est traité comme égal:
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)))