Respuesta corta
new Map([...map].sort((a, b) =>
))
Por ejemplo, al comparar cadenas de valor, que pueden ser iguales, pasamos una función de ordenación que accede a [1] y tiene una condición igual que devuelve 0:
new Map([...map].sort((a, b) => (a[1] > b[1] && 1) || (a[1] === b[1] ? 0 : -1)))
Comparando cadenas de claves, que no pueden ser iguales (claves de cadenas idénticas se sobrescriben entre sí), podemos omitir la condición de iguales. Sin embargo, deberíamos devolver explícitamente -1, porque devolver un perezoso a[0] > b[0]
incorrectamente da falso (tratado como 0, es decir, igual) cuando a[0] < b[0]
:
new Map([...map].sort((a, b) => a[0] > b[0] ? 1 : -1))
En detalle con ejemplos
El .entries()
in [...map.entries()]
(sugerido en muchas respuestas) es redundante, probablemente agregue una iteración adicional del mapa a menos que el motor JS lo optimice para usted.
En el caso de prueba simple, puede hacer lo que pide la pregunta con:
new Map([...map].sort())
... que, si las claves son todas cadenas, compara cadenas de valor-clave unidas por comas comprimidas y coaccionadas como '2-1,foo'
y '0-1,[object Object]'
, devolviendo un nuevo mapa con el nuevo orden de inserción:
Nota: si solo ve {}
la salida de la consola de SO, busque en la consola de su 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()))
SIN EMBARGO , no es una buena práctica confiar en la coerción y la cadena de caracteres como esta. Puede obtener sorpresas 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())
}
Errores como este son realmente difíciles de depurar, ¡no se arriesgue!
Si desea ordenar por claves o valores, es mejor acceder a ellos explícitamente con a[0]
y b[0]
en la función de ordenación, como esta. Tenga en cuenta que deberíamos regresar -1
y 1
para antes y después, no false
o 0
como con raw a[0] > b[0]
porque eso se trata como iguales:
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)))