首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSON副本不会出现在console.log()中

JSON副本不会出现在console.log()中
EN

Stack Overflow用户
提问于 2016-10-03 12:56:17
回答 2查看 144关注 0票数 1

我有一个相当平坦的JSON,它可以有一个不止一次的属性。在我建立了一些逻辑来踢掉“旧”价值观之后,我想当然尝试一下。然后我发现了一些很奇怪的东西。我的逻辑总是计算属性一次,这意味着没有重复。因此,我继续创建了这个虚拟JSON:

代码语言:javascript
复制
 {
  "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并按如下方式记录它:

代码语言:javascript
复制
// loading JSON
let oldResults = require('./dummy.json');
// log JSON    
console.log(oldResults);

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

代码语言:javascript
复制
λ 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,第一个将被记录为其他(不管我更改第一个还是第二个,结果都是一样的):

代码语言:javascript
复制
λ 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要开除第二个约翰?

你好,梅嘉金

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-03 12:57:33

给定的属性名只能在给定对象中存在一次。如果使用对象初始化程序创建对象:

代码语言:javascript
复制
var o = { a: "hello", a: "world" };

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

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

如果您有一些要序列化为JSON的结构,并且该结构具有多个值的属性,那么最好的方法可能是为该属性提供一个数组作为其值:

代码语言:javascript
复制
{
  "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
  }
}
票数 4
EN

Stack Overflow用户

发布于 2016-10-03 13:02:31

它与Node无关,它是一般的javascript原则,当您向其添加属性时,对象是增强的。

代码语言:javascript
复制
const a = {};
a['Jhon'] = {'revisionDate':101};
a['Jhon'] = {'revisionDate':102};

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

这是因为当您重新初始化对象属性时,它会被更新。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39832226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档