如何查找和更新对象数组中的值?

2022-08-30 00:50:57

我有一个对象数组。我想通过某个字段查找,然后更改它:

var item = {...}
var items = [{id:2}, {id:2}, {id:2}];

var foundItem = items.find(x => x.id == item.id);
foundItem = item;

我希望它更改原始对象。如何?(我不在乎它是否也会在洛达什。


答案 1

您可以使用 findIndex 在对象的数组中查找索引,并根据需要替换它:

var item = {...}
var items = [{id:2}, {id:2}, {id:2}];

var foundIndex = items.findIndex(x => x.id == item.id);
items[foundIndex] = item;

这假定具有唯一的 ID。如果您的 ID 是重复的(如您的示例所示),则最好使用 forEach:

items.forEach((element, index) => {
    if(element.id === item.id) {
        items[index] = item;
    }
});

答案 2

我最好的方法是:

var item = {...}
var items = [{id:2}, {id:2}, {id:2}];

items[items.findIndex(el => el.id === item.id)] = item;

查找索引的参考

如果您不想用新对象替换,而是复制 的字段,则可以使用:itemObject.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))

功能方法

不要修改数组,使用新的数组,这样就不会产生副作用

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内容,然后我们需要更新列表并将其作为列表发送回数据库时,通常会发生此问题。

好消息是,保留了引用,因此您可以组织代码以利用它,并将a视为具有免费标识的对象,这些标识是从0到的整数。因此,每次访问 Object 的任何属性时,请按 为 执行 操作,并且不会丢失引用,并且原始对象会更改。请记住,当你的真主来源只有一个(创建的对象),并且你的应用始终一致地使用同一个对象(而不是从数据库多次提取并沿组件的生命周期将其分配给该对象)时,这很有用。listlength -1list[i]list

坏消息是架构是错误的,如果这是你需要的,你应该通过ids(字典)接收一个对象,比如

{ 
  1232: { id: 1232, ...},
  asdf234asf: { id: 'asdf234asf', ...},
  ...
}

这样,您就不会在数组中搜索,这会消耗资源。您“只需通过对象中的键进行访问”,这是即时且高性能的。