我有一个对象:
[name: string]: Person;
我想按键排序,即Person's
名称。是否可以这样做或者这种地图是不合格的,或者我应该用不同类型的集合替换它,我想避免它。
答案 0 :(得分:2)
一个对象在技术上可排序,但这样做往往会引发一个问题,即你首先使用的是什么。
但是,为了尽可能少地解决您的问题,这是影响对象键的插入顺序的一种方法:
function sortMap(map, compare) {
return Object
.entries(map)
.sort(compare)
.reduce((map, [key, value]) => Object.assign(map, {
[key]: value
}), {})
}
console.log(sortMap({
"Joe": {},
"Bob": {},
"Alice": {},
"Kevin": {},
"Sarah": {}
}, ([a], [b]) => a.localeCompare(b)))

参考文献:
如链接答案中所述,依赖于对象的插入顺序并不能保证迭代顺序,因为它不在规范中,但它目前是 de-facto 标准在许多实现中,并且看起来这种行为将来不会发生变化。
要获得规范对迭代顺序的正式保证,请按照评论中的建议使用Map
。
作为附录,如果您应该选择使用它们,请按以下方式对地图的迭代顺序进行排序:
function sortMap(map, compare) {
return new Map(
Array
.from(map)
.sort(compare)
)
}
let people = new Map([
['Joe', {}],
['Bob', {}],
['Alice', {}],
['Kevin', {}],
['Sarah', {}]
])
let sorted = sortMap(
people,
([a], [b]) => a.localeCompare(b)
)
console.log(Array.from(sorted))