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

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

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

我想让它改变原来的对象。怎么做?(我不在乎它是否也会在Lodash中。)


当前回答

你也可以这样做

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

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

OR

items.filter((x) => x.id ==  item.id).pop()=item;

 

其他回答

你可以使用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;
    }
});

我还没有在答案中看到这种方法,所以这里有一个简单的小代码

let item = {id: 1, new: true};
let items = [{id: 1}, {id: 2}];

let replaced = [item, ...items.filter(i => i.id !== item.id)]

您只是将项目添加到要替换的项目筛选的原始数组中。

另一种方法是使用拼接。

splice()方法通过删除或替换现有元素和/或在适当位置添加新元素来更改数组的内容。

注意:如果你正在使用响应式框架,它会更新“视图”,你的数组“知道”你已经更新了它。

答:

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

let foundIndex = items.findIndex(element => element.id === item.id)
items.splice(foundIndex, 1, item)

如果你只想改变一个项的值,你可以使用find函数:

// Retrieve item and assign ref to updatedItem
let updatedItem = items.find((element) => { return element.id === item.id })

// Modify object property
updatedItem.aProp = ds.aProp

你也可以这样做

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

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

OR

items.filter((x) => x.id ==  item.id).pop()=item;

 

为我工作

let returnPayments = [ ...this.payments ];

returnPayments[this.payments.findIndex(x => x.id == this.payment.id)] = this.payment;