【问题标题】:Is it a bug on javascript Object entries foreach?它是 javascript 对象条目 foreach 的错误吗?
【发布时间】:2026-01-23 23:45:01
【问题描述】:

我正在尝试使用 Object.entries 将对象转换为键值对列表,然后循环每个条目,一切都很好,除了结果顺序与我给出的对象不同,然后是键就像 "06""01" 或者以 "0"

开头的

这是在 NodeJs V10.16.0, UTF-8 字符集上测试的。

const obj1 = {
  '01': "val1",
  "06": "val6",
  "13": "val13",
  "88": "val88",
  "100": "val100"
}

Object.entries(obj1).forEach(([k, v]) => {
  console.log(k + "-" + v)
})

上面代码的结果是:

13-val13
88-val88
100-val100
01-val1
06-val6

我希望输出与我给出的对象的顺序相同,如下所示:

01-val1
06-val6
13-val13
88-val88
100-val100

只有当对象中的属性键以 "0" 开头的另一种类型的属性时才会发生这种情况。 请帮忙看看到底是什么?

【问题讨论】:

  • 对象不需要维护属性的顺序。
  • 这不是错误。 javascript的官方规范没有指定对象的键顺序
  • 如果您想维护广告订单,请使用Map
  • @HaukurHaf 但是如果对象中的属性键不是以“0”开头,结果会很好,我在对象中给出的顺序将是相同的结果。
  • @Rizesky i dont want to maintain the insertion order,你显然,根据你的预期输出。

标签: javascript node.js object foreach


【解决方案1】:

如 cmets 中所述,对象不需要按插入顺序迭代属性。如果您要求迭代顺序与插入顺序相匹配,请改用Map

const map1 = new Map([
  ['01', "val1"],
  ["06", "val6"],
  ["13", "val13"],
  ["88", "val88"],
  ["100", "val100"]
]);

for (const [k, v] of map1) {
  console.log(k + "-" + v);
}

【讨论】:

    【解决方案2】:

    JavaScript 对象是一个 未排序 键值存储,也就是 Associative Array。这与 Java 的 Maps 或 Python 的 dicts 相当。在获取或迭代键、值或键值对时,绝对不能保证任何顺序。您可能看到的任何订单都是由于内部实现而导致的,不能依赖。你甚至可能不依赖它是确定性的。

    这些对象是等价的:

    const obj1 = {
      '01': "val1",
      "06": "val6",
      "13": "val13",
      "88": "val88",
      "100": "val100"
    }
    const obj2 = {
      "100": "val100",
      "06": "val6",
      "13": "val13",
      "88": "val88",
      '01': "val1"
    }
    

    对于已排序的条目,请使用 MapArray

    【讨论】: