Коротка відповідь
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()
in [...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
і 1
для до і після, а НЕ false
або , 0
як з сирим , 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)))