【问题标题】:In an array of objects, how to update (not just find) the object having property X equal to Y?在对象数组中,如何更新(而不仅仅是查找)属性 X 等于 Y 的对象?
【发布时间】:2020-04-14 01:55:08
【问题描述】:

我的对象数组包含不同种类的对象,这意味着它们可以具有非常不同的属性。但是,它们都共享一个 id 属性。

当我的应用程序的用户想要更新其中一个对象时,我需要根据id 在数组中找到该对象并更新其所有属性,可能使用Object.assign()

我知道如何根据id 找到并返回我想要的对象,但也不知道如何更新它。有什么想法吗?

let myArray = [
  {
    id: 1,
    name: 'john',
    age: '22',
    position: 'developer'
  },
  {
    id: 2,
    name: 'james',
    age: '31',
    position: 'designer'
  },
  {
    id: 1,
    name: 'david',
    age: '45',
    position: 'teacher'
  }
]

let updateForJames = {
    age: '38',
    position: 'project manager'
}

let JamesId = 2

Object.assign(myArray, {
    // ...
})

JSFiddle

【问题讨论】:

标签: javascript arrays ecmascript-6


【解决方案1】:

如果您对更改数组感到满意就地,您可以使用.find() 查找具有给定ID 的对象,然后使用Object.assing() 更新该对象,如下所示:

const myArray = [{ id: 1, name: 'john', age: '22', position: 'developer' }, { id: 2, name: 'james', age: '31', position: 'designer' }, { id: 1, name: 'david', age: '45', position: 'teacher' }];
const updateForJames = {
  age: '38',
  position: 'project manager'
}
const JamesId = 2;

const jamesobj = myArray.find(({id}) => id === JamesId) || {};
Object.assign(jamesobj, updateForJames);
console.log(myArray);

或者,如果您想获得一个新数组(而不是就地修改它),您可以将.map() 每个对象添加到一个新对象,并在詹姆斯的 id 出现时使用扩展语法将新内容添加到updateForJames

const myArray = [{ id: 1, name: 'john', age: '22', position: 'developer' }, { id: 2, name: 'james', age: '31', position: 'designer' }, { id: 1, name: 'david', age: '45', position: 'teacher' }];
const updateForJames = {
  age: '38',
  position: 'project manager'
}
const JamesId = 2;

const new_array = myArray.map(
  ({id, ...r}) => id === JamesId ? {id, ...r, ...updateForJames} : {id, ...r}
);
console.log(new_array);

【讨论】:

  • 谢谢!它可以工作,但是我不明白为什么:我使用第一个选项,因为我需要更改原位数组,但是您在 jamesobj 上使用 Object.assign() 而不是原位数组,那么后者如何被修改?我不明白
  • 所以.find() 返回对数组内对象的引用。这意味着当您更改此引用的属性时,您实际上是在更改数组中的对象。 Object.assign() 允许我们一次更改引用中的多个属性(以及数组中的对象)
  • 所以这与here 发生的事情类似,只是Object.assign() 允许我们一次更改引用上的多个属性,而不仅仅是一次更改一个属性
  • 感谢您的澄清,现在我明白了:)
  • 多么愚蠢的遗漏,抱歉。现在可以工作了,我现在也看到了控制台中这种奇怪现象背后的原因。非常感谢,祝您有愉快的一天!
猜你喜欢
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
相关资源
最近更新 更多