Короткий ответ
new Map([...map].sort((a, b) =>
))
Например, сравнивая строки значений, которые могут быть равными, мы передаем функцию сортировки, которая обращается к [1] и имеет условие равенства, которое возвращает 0:
new Map([...map].sort((a, b) => (a[1] > b[1] && 1) || (a[1] === b[1] ? 0 : -1)))
Сравнивая ключевые строки, которые не могут быть равными (одинаковые строковые ключи будут перезаписывать друг друга), мы можем пропустить условие равенства. Однако мы все равно должны явно возвращать -1, потому что возвращение ленивого запроса a[0] > b[0]
неверно дает false (обрабатывается как 0, т.е. равно), когда a[0] < b[0]
:
new Map([...map].sort((a, b) => a[0] > b[0] ? 1 : -1))
Подробно с примерами
.entries()
В [...map.entries()]
(предлагается во многих ответах) является излишним, возможно добавление дополнительной итерации карты , если Оптимизирует двигателя JS , что далеко для вас.
В простом тестовом примере вы можете сделать то, что требует вопрос, с помощью:
new Map([...map].sort())
... который, если все ключи являются строками, сравнивает сжатые и принудительно соединенные запятыми строки ключ-значение, такие как '2-1,foo'
и '0-1,[object Object]'
, возвращая новую карту с новым порядком вставки:
Примечание: если вы видите только {}
вывод консоли SO, посмотрите в консоль своего реального браузера.
const map = new Map([
['2-1', 'foo'],
['0-1', { bar: 'bar' }],
['3-5', () => 'fuz'],
['3-2', [ 'baz' ]]
])
console.log(new Map([...map].sort()))
ОДНАКО , полагаться на такое принуждение и привязку - не лучшая практика. Вы можете получить такие сюрпризы, как:
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())
}
Подобные ошибки действительно сложно отлаживать - не рискуйте!
Если вы хотите отсортировать ключи или значения, лучше всего обращаться к ним явно с помощью функции сортировки a[0]
и b[0]
в ней, например. Обратите внимание, что мы должны возвращать -1
and 1
for before и after, not false
или 0
as с raw, a[0] > b[0]
потому что это рассматривается как равное:
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)))