附加到不是数组的 JS 对象?

Posted

技术标签:

【中文标题】附加到不是数组的 JS 对象?【英文标题】:Appending to a JS object that is not an array? 【发布时间】: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 【参考方案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 中获得,该版本已经超过一年了。无论如何,这只是在 *** 上运行的一个示例【参考方案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;

【讨论】:

以上是关于附加到不是数组的 JS 对象?的主要内容,如果未能解决你的问题,请参考以下文章

使用 NodeJS 将新对象附加到 DynamoDB 中的 JSON 数组

D3.js 将对象绑定到数据并为每个键附加

为啥在 JS 的 reduce 数组方法中将布尔值附加到我的当前值?

将委托附加到数组中的对象

JavaScript - 如何合并/附加到对象/数组 - ReactJS - 传播语法

如何将对象数组附加到已经存在的数组? [复制]