【问题标题】:Go through an already existing object without altering order在不改变顺序的情况下遍历已经存在的对象
【发布时间】:2016-07-14 06:45:26
【问题描述】:

我知道对象的属性不能保证以任何特定顺序存储或读取。

我遇到的问题是我不能使用对象或数组。我已经有一个像这样的大且非常嵌套的 JSON 文件:

{ "occasion": 23, "mayorstips": { "1": 0, "3": 0, "2": 0...

我只需要做一些修改。这就是我开始使用它的方式:

var campaign = JSON.parse(fs.readFileSync(theJSONFile));
for(var plot in plots) {
    if(plots.hasOwnProperty(plot)) {
        switch(plots[plot].province) {
            case 'forest':
               ...

当我完成后,我只是把它放回去:

fs.writeFileSync(theJSONFile, JSON.stringify(campaign));

现在,我注意到这种方法存在两个问题:

  1. 原始间距格式丢失。该原始文件只是一长行,并且必须是一长行,因此JSON 库的任何格式化尝试都没有帮助。我用一些正则表达式替换解决了它。
  2. 现在“JSON 行”文件已排序。所以我从{ "1": 0, "3": 0, "2": 0 转到{ "1": 0, "2": 0, "3": 0,结果发现这是个大问题。
  3. 0 结尾的浮点数将被截断。该文件需要浮点数始终有六位小数,例如,34.293800。但是当我打开它时,数字变为34.2938

这是一个 35,000 个字符的行。这是如何解决问题 #2 和 #3?我可以为#3 做另一个正则表达式替换,但也许我缺少一些东西。

【问题讨论】:

  • 您正在阅读的 json 文件,是您创建的还是您从某个地方获取的?如果它是由您创建的,我强烈建议您更改其结构。如果任何地方的顺序对您很重要,最好将它们保存在数组中而不是对象属性中。如果 0 对您很重要,请将这些数字保存在字符串中
  • 它说这不取决于他。我看到的唯一选择是将数据推送到数组中以保持顺序,然后将其转换回来。这不能纯粹用 JSON 来完成,因为每个 JS 引擎对它的排序都不同。 stackoverflow.com/questions/8931967/…
  • 对于这种受限的用例,我建议进行字符串操作,进行子字符串搜索并找到键及其值。然后替换/操作字符串。尽管这种方法效率低下,但考虑到您的限制......
  • @shinobi 这不是我创建的,这就是问题所在。这是我试图根据自己的喜好修改的软件的输出,它似乎对排序和所有其他东西非常挑剔。
  • @NidhinDavid 恐怕你是对的,它实际上是我现在使用正则表达式替换的代码的一半。我只是在寻找我没有的绝妙想法。

标签: javascript arrays json node.js


【解决方案1】:

看问题和cmets,就是字符串操作。 我不完全知道您想对数据做什么,但是,如果 json 使您的数据处理变得容易,您可以将两者结合起来。

  1. 假设您将其读取为字符串,此时使用正则表达式将 1,3,2 的顺序存储在数组中的 { "1": 0, "3": 0, "2": 0... 中,并在需要保持 0 的数字周围添加引号。
  2. 现在将此字符串转换为 json。
  3. 处理您的数据
  4. 将 json 转换回字符串(同时将您在步骤 1 中创建的数组转换回所需格式 { "1": 0, "3": 0, "2": 0... in string)

也看看这个问题 How to keep an Javascript object/array ordered while also maintaining key lookups?

希望对您有所帮助。万事如意!

【讨论】:

  • 我正在处理字符串,基本上是纯正则表达式。关于你的回答,解析/字符串化方法是什么搞砸了订单......除非我理解正确,否则会有同样的问题。
  • 是的,但我要求您先将其作为文本文件读取,然后从该文本(字符串)中首先将订单存储在数组中的某个位置。然后你把它解析成json。尽管现在您将更改顺序,但您的数组中仍然有正确的顺序。因此,在进行字符串化时,您将从数组中选择顺序。希望这很清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
  • 1970-01-01
  • 2021-11-01
  • 2013-10-21
相关资源
最近更新 更多