JSON重复项不会出现在console.log()中

时间:2016-10-03 12:56:18

标签: javascript json node.js

我有一个非常平坦的JSON,它可以有多个属性。在我构建了一些逻辑来推出“旧”值之后,我想尝试一下。然后我发现了一些非常奇怪的事我的逻辑总是计算一次属性,这意味着没有重复。所以我继续创建了这个虚拟JSON:

 {
  "John": {
      "id": 10001,
      "name": "John Doe",
      "iconId": 10,
      "level": 12,
      "revisionDate": 1000000000001
  },
  "John": {
      "id": 10001,
      "name": "John Doe",
      "iconId": 10,
      "level": 12,
      "revisionDate": 1000000000005
  },
  "Amy": {
      "id": 10002,
      "name": "Amy Smith",
      "iconId": 15,
      "level": 11,
      "revisionDate": 1000000000001
  }
}

如你所见,这里的副本是约翰。唯一的区别是他的修改日期。

现在我在NodeJS中加载JSON并将其记录为:

// loading JSON
let oldResults = require('./dummy.json');
// log JSON    
console.log(oldResults);

此时奇怪的事情发生了。我的控制台将向我展示我的JSON和Amy中的第二个约翰,但从来没有第一个John:

λ node debug.js
{ John:
   { id: 10001,
     name: 'John Doe',
     iconId: 10,
     level: 12,
     revisionDate: 1000000000005 },
  Amy:
   { id: 10002,
     name: 'Amy Smith',
     iconId: 15,
     level: 11,
     revisionDate: 1000000000001 } }

如果我将第二个John更改为John123,则第一个将被记录为其他人(无关紧要如果我更改第一个或第二个,结果将是相同的): < / p>

λ node debug.js
{ John:
   { id: 10001,
     name: 'John Doe',
     iconId: 10,
     level: 12,
     revisionDate: 1000000000001 },
  John123:
   { id: 10001,
     name: 'John Doe',
     iconId: 10,
     level: 12,
     revisionDate: 1000000000005 },
  Amy:
   { id: 10002,
     name: 'Amy Smith',
     iconId: 15,
     level: 11,
     revisionDate: 1000000000001 } }

我用普通的Windows CMD和CMDER试过这个。两者都显示了相同的结果。我也清除了节点缓存,仍然没有成功......我在我的debug.js中加载了这个JSON而没有其他逻辑,这可能会改变JSON。

有人可以解释一下为什么NodeJS会踢出第二个约翰?

此致,Megajin

2 个答案:

答案 0 :(得分:4)

给定的属性名称只能在给定对象中存在一次。如果使用对象初始值设定项创建对象:

var o = { a: "hello", a: "world" };

然后你最终只得到一个名为&#34; a&#34;的属性。 (在严格模式下,您最终会出错。)

解析JSON时,您遇到同样的问题:JSON解析器以递增方式构造对象图,重复的属性名将覆盖该属性的任何先前设置的值。

如果你有一些你希望序列化为JSON的结构,并且结构具有多个值的属性,那么最好的方法是给属性一个数组作为其值:

{
  "John": [
    {
        "id": 10001,
        "name": "John Doe",
        "iconId": 10,
        "level": 12,
        "revisionDate": 1000000000001
    },
    {
        "id": 10001,
        "name": "John Doe",
        "iconId": 10,
        "level": 12,
        "revisionDate": 1000000000005
    }
  ],
  "Amy": {
      "id": 10002,
      "name": "Amy Smith",
      "iconId": 15,
      "level": 11,
      "revisionDate": 1000000000001
  }
}

答案 1 :(得分:1)

它与Node无关,一般的javascript原则是,当你向它添加属性时,对象会被扩充。

const a = {};
a['Jhon'] = {'revisionDate':101};
a['Jhon'] = {'revisionDate':102};

console.log(a.Jhon);
//print: {''revisionDate':102}

这是因为重新初始化对象属性会更新。