将内容追加到非数组的JS对象中?

5
我有一个类似于这样的对象。
{
  "_id": "DEADBEEF",
  "_rev": "2-FEEDME",
  "name": "Jimmy Strawson",
  "link": "placeholder.txt",
  "entries": {
    "Foo": 0
  }
}

使用$.getJSON调用将数据读入我的JavaScript代码中。

因此,我有一个名为“reply”的JS对象,其中包含所有这些数据。

我需要添加项,使得“entries”变为如下所示的扩展形式:

{
  "_id": "DEADBEEF",
  "_rev": "2-FEEDME",
  "name": "Jimmy Strawson",
  "link": "placeholder.txt",
  "entries": {
    "Foo": 0,
    "Bar": 30,
    "Baz": 4
  }
}

我尝试过

reply['entries'].push({"Bar": 0});

但这不起作用(我认为是因为没有数组)

有人能提供另一种方法吗?


3
reply.entries.Bar = 0; - zerkms
JSON对象不能长成那样。它是JavaScript引擎中的内在对象。 - Teemu
2
让我们不要在JSON /对象字面量辩论上浪费太多时间。我们都知道OP的意思。 OP,请阅读此链接~http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/ - Phil
嗯,reply.entries.Bar = "string"; - adeneo
1
我认为OP的意思是 reply.entries['Bar Baz'] = 0 - Phil
显示剩余8条评论
6个回答

5

使用 ES2017,你可以使用以下代码:

const input = (
  { _id: 'DEADBEEF'
  , _rev: '2-FEEDME'
  , name: 'Jimmy Strawson'
  , link: 'placeholder.txt'
  , entries: (
      { Foo: 0
      }
    )
  }
)
 
const output = (
  { ...input
  , entries: (
      { ...input.entries
      , Bar: 30
      , Baz: 4
      }
    )
  }
)

console.info(JSON.stringify(output, null, 2))

注意:这不会改变原始输入对象,而是返回一个新的对象(通常是一件好事)。

这意味着对于输入对象的任何更改都不会影响原始对象,因为函数将创建一个新对象并返回它,而不是在原始对象上进行更改。

1
关于原始数据的不可变性,这是一个很好的观点。我会把那段文字放大 :) - Phil

4

这里再分享一个技术,因为何乐而不为呢~ 请见Object.assign

let reply = {"_id":"DEADBEEF","_rev":"2-FEEDME","name":"Jimmy Strawson","link":"placeholder.txt","entries":{"Foo":0}};

Object.assign(reply.entries, {
    Bar: 30,
    Baz: 4,
    'Bar Baz': 0
});

console.log('reply =', reply);


@DivyanshuMaithani 可能是 let 的问题。你使用的是哪个浏览器? - Phil
是的,一定是这样。我的Chrome有点过时了。也许使用严格模式会有帮助。 - Divyanshu Maithani
@DivyanshuMaithani 不会,let从Chrome 41.0开始就可用了,现在已经过去一年多了。无论如何,这只是一个在StackOverflow上运行的示例。 - Phil

3
reply['entries'].push({"Bar": 0})不起作用,因为entries不是Array类型,而只是一个普通的Object

请使用reply['entries']["Bar"]reply.entries.Bar。请参见以下演示:

var reply = {
  "_id": "DEADBEEF",
  "_rev": "2-FEEDME",
  "name": "Jimmy Strawson",
  "link": "placeholder.txt",
  "entries": {
    "Foo": 0,
    "Bar": 30,
    "Baz": 4
  }
}
reply['entries']["Bar"] = 0;

console.log(reply);


1
谢谢先生!我会在8分钟后接受它,当它允许我的时候。 - Hubert S. Cumberdale
1
没有 Array [type](http://ecma-international.org/ecma-262/7.0/index.html#sec-ecmascript-data-types-and-values)。有一个内置的 Array 构造函数,可以从中创建数组实例。构造函数及其实例是类型 [Object](http://ecma-international.org/ecma-262/7.0/index.html#sec-object-type)。;-) - RobG
没错!一个 Array 是一个特殊的 Object - 这就是我试图传达的 :) - kukkuz

2

它变成了一个对象,所以只需添加您想要的内容 :-

reply.entries.Foo = 0
reply.entries.Bar = 30
reply.entries.Baz = 4

或者 reply["entries"]["Foo"] = 0

或者 reply.entries["Foo"] = 0


你的 Object.assign 示例将从 reply.entries 中删除 Foo 属性。 - Phil
是的,需要使用扩展运算符,但那并不是 JavaScript 的一部分。 - Keith Nicholas
不是的,你只需要对 reply.entries 进行操作,而不是 reply - Phil

1
为了向JSON对象中插入新条目,您可以尝试以下操作: object["someproperty"] = somevalue;object.someproperty = somevalue; 假设您已经有了变量somepropertysomevalue的键和值,您可以简单地将它们插入为:
reply.entries[someproperty] = somevalue

1

Here is the alternate method:

reply = {
          "_id": "DEADBEEF",
          "_rev": "2-FEEDME",
          "name": "Jimmy Strawson",
          "link": "placeholder.txt",
          "entries": {
            "Foo": 0
          }
        }
reply.entries.Bar=30;
reply.entries.Baz=4;
reply["entries"]["Bar"]=30;
reply["entries"]["Baz"]=4;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接