คำตอบสั้น ๆ
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]
อย่างไม่ถูกต้องจะให้เท็จ (ถือว่าเป็น 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
และ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)))