Câu trả lời ngắn
new Map([...map].sort((a, b) =>
))
Ví dụ: so sánh các chuỗi giá trị, có thể bằng nhau, chúng tôi truyền một hàm sắp xếp truy cập [1] và có điều kiện bằng trả về 0:
new Map([...map].sort((a, b) => (a[1] > b[1] && 1) || (a[1] === b[1] ? 0 : -1)))
So sánh các chuỗi khóa, không thể bằng nhau (các khóa chuỗi giống nhau sẽ ghi đè lên nhau), chúng ta có thể bỏ qua điều kiện bằng. Tuy nhiên, chúng ta vẫn nên trả về -1 một cách rõ ràng, bởi vì trả về một lười biếng a[0] > b[0]
không chính xác sẽ cho sai (được coi là 0, tức là bằng) khi a[0] < b[0]
:
new Map([...map].sort((a, b) => a[0] > b[0] ? 1 : -1))
Chi tiết với các ví dụ
Các .entries()
trong [...map.entries()]
(đề xuất trong nhiều câu trả lời) là không cần thiết, có thể thêm một lần lặp thêm bản đồ trừ khi sử dụng tối ưu động cơ JS mà đi cho bạn.
Trong trường hợp thử nghiệm đơn giản, bạn có thể thực hiện những gì câu hỏi yêu cầu với:
new Map([...map].sort())
... mà, nếu các khóa là tất cả các chuỗi, so sánh các chuỗi khóa-giá trị được nối bằng dấu phẩy bị thu hẹp và ép buộc như '2-1,foo'
và '0-1,[object Object]'
, trả về một Bản đồ mới với thứ tự chèn mới:
Lưu ý: nếu bạn chỉ thấy {}
trong đầu ra bảng điều khiển của SO, hãy tìm trong bảng điều khiển trình duyệt thực của bạn
const map = new Map([
['2-1', 'foo'],
['0-1', { bar: 'bar' }],
['3-5', () => 'fuz'],
['3-2', [ 'baz' ]]
])
console.log(new Map([...map].sort()))
TUY NHIÊN , nó không phải là một phương pháp hay nếu dựa vào sự ép buộc và nghiêm ngặt như thế này. Bạn có thể nhận được những điều bất ngờ như:
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())
}
Những lỗi như thế này thực sự rất khó để gỡ lỗi - đừng mạo hiểm!
Nếu bạn muốn sắp xếp trên các khóa hoặc giá trị, tốt nhất nên truy cập chúng một cách rõ ràng bằng a[0]
và b[0]
trong hàm sắp xếp, như thế này. Lưu ý rằng chúng ta nên quay lại -1
và 1
trước và sau, không false
hoặc 0
như với dữ liệu thô a[0] > b[0]
vì điều đó được coi là bằng:
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)))