我有一个非常平坦的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
答案 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}
这是因为重新初始化对象属性会更新。