保留对象顺序

时间:2019-03-16 10:04:51

标签: javascript node.js

我有一个data.js文件,其中包含这样的对象:

var somedata = {
  "": "test",
  "51": "f",
  "123": "test1",
  "67": "test2",
  "hello": "ghr",
  ...
}

module.exports = somedata;

不幸的是,该对象被重新排序,并且顺序对于应用程序非常重要。此时,有人建议使用地图

因此,它变成了:

var somedata = new Map(Object.entries({
 "": "test",
 "51": "f",
 "123": "test1",
 "67": "test2",
 "hello": "ghr",
 ...
}))

module.exports = somedata;

嗯,那也不起作用(或者也许我只是没有得到地图)。因此,目前我建立了一种变通方法,在该方法中,我实际上使用regex读取了文件并将其放入map对象中以保留对象顺序。不幸的是,随着data.js变得越来越大,这种方法非常耗时。在那一点上,我觉得我在错误地看待事物。

我的问题:是否可以某种方式保留对象顺序?或者至少比解析整个文件更快的解决方法?

2 个答案:

答案 0 :(得分:2)

您可以使用地图,但如果您输入的是对象,则不能使用地图。 Objects do not guarantee key order。相反,您可以使用成对的数组并从中构造一个映射。 Maps preserve insertion order

const input = [
  [42, "Alice"],
  [30, "Bob"],
  [14, "Carol"],
  [39, "David"],
  [41, "Edel"],
  [2, "Fred"],
]

const map = new Map(input);

for(const [key, value] of map.entries()) {
  console.log(key, value)
}

答案 1 :(得分:1)

除了在插入时使用数组或其他保持顺序数据结构来保存键的顺序外,没有其他方法。

对象的键首先按照值(以32位正数作为字符串)之类的索引进行排序,然后按插入顺序依次处理其他字符串,然后按符号进行排序。

一种快速的解决方法是在数字前面加一个破折号作为密钥,并使用它来访问对象。