【问题标题】:How to sort key value pairs in javascript如何在javascript中对键值对进行排序
【发布时间】:2018-03-06 02:19:36
【问题描述】:

我有一个对象:

[name: string]: Person;

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

【问题讨论】:

  • 当你说“地图”时,你是指Map吗?
  • @PatrickRoberts 不,我没有,我的意思是我问题中的代码中的任何内容,因为我工作中的一些人不使用正确的集合和类型,而是使用上面看到的东西。跨度>
  • 即使你有一个排序的地图,你如何将它与这些信息一起使用?
  • @NinaScholz 我想影响for..in 循环的迭代顺序将有助于执行具有预期结果的线性搜索。

标签: typescript


【解决方案1】:

一个对象在技术上是可排序的,尽管这样做往往会引发一个问题,即为什么首先要使用一个对象。

但是,为了尽可能轻松地解决您的问题,这里有一种方法可以影响对象键的插入顺序:

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,如 cmets 中所推荐的那样。

作为附录,如果您应该选择使用它们,以下是如何对地图的迭代顺序进行排序:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2019-08-17
    • 2016-11-12
    • 2016-11-17
    • 2021-03-06
    相关资源
    最近更新 更多