【问题标题】:Appending to a JS object that is not an array?附加到不是数组的 JS 对象?
【发布时间】:2017-02-22 01:24:08
【问题描述】:

我有一个看起来像这样的对象

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

通过 $.getJSON 调用将其读入我的 javascript。

所以我有了保存所有这些数据的 JS 对象“回复”。

我需要附加项目,使“条目”扩展如下:

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

我试过了

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

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

有人可以提供替代方法吗?

【问题讨论】:

  • reply.entries.Bar = 0; PS:reply 是 JS 对象而不是 JSON。
  • JSON 对象不能这样。它是 JavaScript 引擎中的一个内在对象。
  • 谢谢@zerkms!!现在如果“Bar”必须是一个字符串,比如“Bar Baz”,我该怎么办?对不起。我是 javascript 新手!
  • 让我们不要对所有这些 JSON / 对象字面量的争论进行太长时间。我们都知道 OP 是什么意思。 OP,请看这个~benalman.com/news/2010/03/theres-no-such-thing-as-a-json
  • 我认为OP的意思是reply.entries['Bar Baz'] = 0

标签: javascript jquery arrays node.js object-literal


【解决方案1】:

使用 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))

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

【讨论】:

  • 关于原始数据的不变性,这是一个很好的观点。我会让那个文本更大:)
【解决方案2】:

还有一个,因为为什么不呢~见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。你运行的是什么浏览器?
  • 是的,一定是这样。我的 Chrome 有点过时了。也许使用严格模式可以解决问题。
  • @DivyanshuMaithani 不,不会。 let 可从 Chrome 41.0 中获得,该版本已经超过一年了。无论如何,这只是在 StackOverflow 上运行的一个示例
【解决方案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);

【讨论】:

  • 谢谢您,先生! 8分钟后我会接受
  • 没有数组type。有一个内置的 Array 构造函数,可以从中创建数组实例。构造函数及其实例的类型为Object。 ;-)
  • 没错! Array 是一个特殊的 Object- 这就是我试图传达的:)
【解决方案4】:

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

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 属性
  • 是的,需要扩展运算符,但这还不是 js 的一部分
  • 不是真的,你只需要在reply.entries而不是reply上操作
【解决方案5】:

为了在 JSON 对象中插入新条目,您可以尝试以下操作:

object["someproperty"] = somevalue;object.someproperty = somevalue;

假设您在变量somepropertysomevalue 中有键和值,您可以简单地将它们插入为:

reply.entries[someproperty] = somevalue

【讨论】:

    【解决方案6】:

    这是替代方法:

    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;
    

    【讨论】:

      猜你喜欢
      • 2019-08-30
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 2015-10-11
      • 2017-05-26
      • 2020-08-15
      • 1970-01-01
      • 2017-08-17
      相关资源
      最近更新 更多