JSON重复不会显示在console.log()

我有一个非常平坦的JSON,可以有一个以上的属性。 在我build立了一些逻辑来剔除“旧”价值观之后,我想尝试一下。 然后我发现了一些很奇怪的东西 我的逻辑总是数过一次,这意味着没有重复的属性。 所以我继续创build这个虚拟的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 } } 

正如你可以看到这里的重复是约翰。 唯一的区别是他的修改date。

现在我在NodeJS中加载JSON并将其logging如下:

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

在这一点上,奇怪的事情发生。 我的控制台会显示我的JSON和艾米的第二个约翰,但从来没有第一个约翰:

 λ 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,第一个将会被logging为其他人(不要紧,如果我改变第一个或第二个,结果将是相同的):

 λ 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尝试过了。 两者都显示了相同的结果。 另外我清除节点caching,仍然没有成功…我加载这个JSON在我的debug.js没有其他的逻辑,这可能会改变JSON。

有人能解释一下为什么NodeJS会踢出第二个John吗?

问候,Megajin

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

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

那么你最终只有一个名为“a”的属性。 (在严格模式下,最终会出现错误。)

parsingJSON时,会遇到同样的问题:JSONparsing器会逐渐构造对象graphics,重复的属性名称将覆盖该属性的任何先前设置的值。

如果你有一些你想要序列化为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 } } 

它与Node没有关系,这是一般的JavaScript原则,当你添加一个属性的时候,对象是增加的。

 const a = {}; a['Jhon'] = {'revisionDate':101}; a['Jhon'] = {'revisionDate':102}; console.log(a.Jhon); //print: {''revisionDate':102} 

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