我最好的方法是:
var item = {...}
var items = [{id:2}, {id:2}, {id:2}];
items[items.findIndex(el => el.id === item.id)] = item;
参考findIndex
如果你不想用新对象替换,而是复制item的字段,你可以使用Object.assign:
Object.assign(items[items.findIndex(el => el.id === item.id)], item)
作为.map()的替代方案:
Object.assign(items, items.map(el => el.id === item.id? item : el))
Functional approach:
不要修改数组,使用一个新的,这样就不会产生副作用
const updatedItems = items.map(el => el.id === item.id ? item : el)
注意
如果使用得当,对对象的引用不会丢失,因此您甚至可以使用原始对象引用,而不是创建新的引用。
const myArr = [{ id: 1 }, { id: 2 }, { id: 9 }];
const [a, b, c] = myArr;
// modify original reference will change object in the array
a.color = 'green';
console.log(myArr[0].color); // outputs 'green'
这个问题通常发生在使用数据库中的列表,然后映射列表以生成 HTML 内容,该内容将修改列表的元素,然后我们需要更新列表并将其作为列表发送回数据库。
好消息是,保留了引用,因此您可以组织代码以利用它,并将list 视为具有免费标识的对象,这些标识是从 0 到 length -1 的整数。因此,每次访问对象的任何属性时,都以list[i] 进行操作,并且不会丢失引用,并且原始对象会更改。请记住,当您的事实来源只有一个(创建的对象)并且您的应用程序始终始终使用相同的对象(而不是从数据库中获取多次并将其分配给list)时,这很有用组件)。
坏消息是架构是错误的,如果这是你需要的,你应该通过 ids(字典)接收一个对象,比如
{
1232: { id: 1232, ...},
asdf234asf: { id: 'asdf234asf', ...},
...
}
这样,您就不会在数组中搜索,这会消耗资源。您“只需在对象中通过键访问”,这是即时且高效的。