如何在javascript中对键值对进行排序

时间:2017-09-25 07:24:59

标签: typescript

我有一个对象:

[name: string]: Person;

我想按键排序,即Person's名称。是否可以这样做或者这种地图是不合格的,或者我应该用不同类型的集合替换它,我想避免它。

1 个答案:

答案 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))