【问题标题】:Object keys in different order after running Object.keys [duplicate]运行 Object.keys 后,对象键的顺序不同 [重复]
【发布时间】:2020-01-23 14:12:22
【问题描述】:

今天早上我在处理票时遇到了最奇怪的行为。如果您在运行Object.keys 后看到下面的内容,则键的顺序已更改,在F 之后留下了P

我尝试了以下方法:

  • Object.entries - 得到与Object.keys 相同的结果
  • For loop - 得到与Object.keys 相同的结果
  • 我认为# 可能会影响排序,所以我 删除它并重新运行测试。 - 得到与Object.keys 相同的结果

我查看了 ECMAScript 规范,但情况并非如此。任何想法可能导致这种行为?

P.S 我通过在数组上运行 .sort() 解决了这个问题,但我很想知道是什么导致键出现故障。

【问题讨论】:

  • 据我所知,规范并没有告诉任何人如何订购钥匙。浏览器以不同的方式对键进行排序。您永远不应该依赖键的顺序,这就是 Array 的用途。
  • 在 javasciprt 中不保证键的顺序,但是大多数情况下,字符串键是按照它们添加的顺序
  • @KrzysztofKrzeszewski 大多数时候这意味着什么,要么是,要么不是,或者我们在谈论不同的浏览器实现
  • 排序 behavior 由规范定义,但顺序与属性名称无关,除了“数字”属性名称在其他之前。事实上,以任何方式依赖对象属性名称排序都是一种极其脆弱的编码实践。
  • 如果您清除缓存并再次运行它。它会显示相同的顺序吗?

标签: javascript arrays sorting object


【解决方案1】:

因此,您正在尝试将 Map(无序)转换为 Array(有序)。一些浏览器会根据它们添加到对象的顺序转储密钥。有些人以其他方式做到这一点。由于它依赖于浏览器,因此您可以实现的最佳目标是对所述列表进行排序。

我建议在你将它转储到一个数组之后,你应该.sort()它你认为合适的方式。它接受您需要的功能。当然,它是特定于案例的,因此您可能需要利用可选的传入函数进行排序,以最适合您的用例的方式进行比较。由于 sort 的输入可以随心所欲,因此您也可以使用它对所述值的内容进行排序,而不仅仅是键。

【讨论】:

    【解决方案2】:

    this SO Answer 中所述,

    [对象是]属性的无序集合

    在对象中按键存储项目非常有用,以便在一次跳转中检索它们(当您知道键时),但您会丢失顺序。如果您需要按照特定顺序进行思考,请始终使用数组。所以不要拥有这个对象:

    {
      "key1": {
        "name": "Jeff",
        "job": "Bartender"
      },
      "key2": {
        "name": "Jawad",
        "job": "Bus driver"
      }
    }
    

    你会有这个数组:

    [
      {
        "any_unique_identifier_key": "key1",
        "name": "Jeff",
        "job": "Bartender"
      },
      {
        "any_unique_identifier_key": "key2",
        "name": "Jawad",
        "job": "Bus Driver"
      }
    ]
    

    缺点是当您在数组中查找特定元素时,您必须遍历整个元素(或使用二叉树)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      相关资源
      最近更新 更多