【问题标题】:Update properties of an object of an array更新数组对象的属性
【发布时间】:2023-03-18 10:54:01
【问题描述】:

我有一个对象数组,我需要更新数组中特定对象的一些属性,然后对其运行findAndUpdateById 调用。我正在尝试这样做,但它没有更新并给我一个未定义名称属性的错误。我想我没有遵循正确的程序来更新 javascript 的对象,因此我需要帮助。 这是我的数组

let arr = [
  {
    "_id": "1234",
    "customer": {
      "firstName": "John",
      "lastName": "Doe",
      "email": "johndoe@gmail.com",
      "address": "123 Caroline Street"
    }
  }  
]

现在我正在接收这样的参数,我需要在我的对象中更新

let ctx = {
  "params": {
      "changeObject": {
        "firstName": "Ali",
        "email": "ali@gmail.com"
      }
  }
}

【问题讨论】:

  • 您需要引用正确的客户...例如_id
  • “我正在尝试这样做,但它没有更新,并给我一个未定义名称属性的错误。” 请向我们展示该代码,然后复制并粘贴 exact 你得到的错误。对于我们看不到的代码和仅含糊描述的错误,很难为您提供帮助。 :-)
  • 一旦确定要更新的对象是哪个对象,就可以使用 Object.assign:Object.assign(oldObj, newProperties)
  • 我通过对_id 进行.find 调用来获取对象数组,收到的数组中只有一个客户对象
  • 我的代码给了我一个 TypeError: Cannot set property 'firstName' of undefined

标签: javascript arrays mongoose


【解决方案1】:

鉴于:“我通过对 id 进行 .find 调用来获取对象数组,并且接收到的数组中只有一个客户对象

// Given
let arr=[{"_id":"1234","customer":{"firstName":"John","lastName":"Doe","email":"johndoe@gmail.com","address":"123 Caroline Street"}}];
let ctx={"params":{"changeObject":{"lastName":"Ali"}}};

arr[0].customer = Object.assign(arr[0].customer, ctx.params.changeObject);

console.log(arr);

【讨论】:

  • 这确实有效,但是如果在 changeObject 对象中,只传递了一个需要更改的名字,而所有其他应该保持不变,那么这段代码会给出一个错误,指出 lastName 未定义.
  • 你试过了吗?我更改了答案以反映您的评论-效果很好。
  • 是的,我试过了,我不断收到Cannot set email property of undefined
  • 现在是电子邮件 - 您希望我更改答案以便仅更改电子邮件吗?它也会以这种方式完美地工作。我相信您可能无法正确剪切和粘贴代码?
  • 现在可以了。正如您在我的问题中看到的那样,我将原始数组 parcelData 复制到 newData 数组中。我跳过了 newData 并直接在 parcelData 数组上运行了您的代码,并且它起作用了。非常感谢:)
【解决方案2】:

我认为您使用了不同的属性 changePayloadchangeObject

您可能还想为此使用扩展运算符和映射。

let arr = [
  {
    "_id": "1234",
    "customer": {
      "firstName": "John",
      "lastName": "Doe",
      "email": "johndoe@gmail.com",
      "address": "123 Caroline Street"
    }
  }  
];

let ctx = {
  "params": {
      "changePayload": {
        "firstName": "Ali",
        "email": "ali@gmail.com"
      }
  }
}

arr = arr.map( data => ({
  ...data, 
  customer: {...data.customer, ...ctx.params.changePayload}
}) );

console.log( arr );

注意:这将更改数组中的所有对象,但这正是您所要求的。

【讨论】:

  • 这也可以。我认为您是对的,我的代码中肯定存在某种我看不到的错字,但是我得到的解决方案效率更高。感谢您的帮助
猜你喜欢
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多