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}
这是因为对象属性在重新初始化时会得到更新。