我有一个相当平坦的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和艾米中的第二个约翰,但从来没有第一个约翰:
λ 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 } }如果我将第二个约翰改为John123,第一个将被记录为其他(不管我更改第一个还是第二个,结果都是一样的):
λ 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和CMDER中尝试过这一点。两个都给我看了同样的结果。另外,我清除了节点缓存,仍然没有成功.我在我的debug.js中加载了这个JSON,没有其他逻辑,这可能会改变JSON。
谁能解释一下为什么NodeJS要开除第二个约翰?
你好,梅嘉金
发布于 2016-10-03 12:57:33
给定的属性名只能在给定对象中存在一次。如果使用对象初始化程序创建对象:
var o = { a: "hello", a: "world" };最后只有一个名为"a“的属性。(在严格模式下,最终会出现错误。)
当解析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
}
}发布于 2016-10-03 13:02:31
它与Node无关,它是一般的javascript原则,当您向其添加属性时,对象是增强的。
const a = {};
a['Jhon'] = {'revisionDate':101};
a['Jhon'] = {'revisionDate':102};
console.log(a.Jhon);
//print: {''revisionDate':102}这是因为当您重新初始化对象属性时,它会被更新。
https://stackoverflow.com/questions/39832226
复制相似问题