Jawaban singkat
new Map([...map].sort((a, b) =>
))
Misalnya, membandingkan string nilai, yang bisa sama, kita meneruskan fungsi sortir yang mengakses [1] dan memiliki kondisi sama dengan yang mengembalikan 0:
new Map([...map].sort((a, b) => (a[1] > b[1] && 1) || (a[1] === b[1] ? 0 : -1)))
Membandingkan string kunci, yang tidak bisa sama (kunci string identik akan menimpa satu sama lain), kita dapat melewati kondisi sama dengan. Namun, kita tetap harus secara eksplisit mengembalikan -1, karena mengembalikan lazy a[0] > b[0]
salah memberikan false (diperlakukan sebagai 0, yaitu sama) ketika a[0] < b[0]
:
new Map([...map].sort((a, b) => a[0] > b[0] ? 1 : -1))
Secara detail dengan contoh
The .entries()
dalam [...map.entries()]
(disarankan dalam banyak jawaban) berlebihan, mungkin menambahkan iterasi ekstra peta kecuali mengoptimalkan mesin JS yang pergi untuk Anda.
Dalam kasus pengujian sederhana, Anda dapat melakukan apa yang diminta pertanyaan dengan:
new Map([...map].sort())
... yang, jika semua kuncinya adalah string, membandingkan string nilai kunci yang digabung dan dipaksakan seperti '2-1,foo'
dan '0-1,[object Object]'
, menampilkan Peta baru dengan urutan penyisipan baru:
Catatan: jika Anda hanya melihat {}
di keluaran konsol SO, lihat di konsol browser Anda yang sebenarnya
const map = new Map([
['2-1', 'foo'],
['0-1', { bar: 'bar' }],
['3-5', () => 'fuz'],
['3-2', [ 'baz' ]]
])
console.log(new Map([...map].sort()))
NAMUN , bukanlah praktik yang baik untuk mengandalkan paksaan dan stringifikasi seperti ini. Anda bisa mendapatkan kejutan seperti:
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())
}
Bug seperti ini sangat sulit untuk di-debug - jangan ambil risiko!
Jika Anda ingin mengurutkan kunci atau nilai, yang terbaik adalah mengaksesnya secara eksplisit dengan a[0]
dan b[0]
dalam fungsi sortir, seperti ini. Perhatikan bahwa kita harus mengembalikan -1
dan 1
untuk sebelum dan sesudah, bukan false
atau 0
sebagai mentah a[0] > b[0]
karena itu diperlakukan sama:
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)))