我有一个对象数组和一个对象
例如:arr=[{id:1,name:"foo"},{id:2,name:"bar"}]
,而我的新对象是obj={id:1,name:"baz"}
。我想基于数组内的键替换obj。
预期的是
output=[{id:1,name:"baz"},{id:2,name:"bar"}]
我已经完成了一些工作,如下所示:
function removeObjBasedID(arr, obj) {
let newArr = [];
arr.map((item, i) => {
if (item.id == obj.id) {
newArr.splice(i, 1);
} else {
newArr = [...arr, obj];
}
});
return newArr;
}
console.log(removeObjBasedID(arr, obj));
答案 0 :(得分:2)
您可以迭代数组并更新(如果找到),或者推送对象。
function update(array, object) {
for (let i = 0; i < array.length; i++) {
if (array[i].id !== object.id) continue;
array[i] = object;
return;
}
array.push(object);
}
var array = [{ id: 1, name: "foo" }, { id: 2, name: "bar" }],
object = { id: 1, name: "baz" };
update(array, object);
console.log(array);
答案 1 :(得分:1)
const arr = [{id:1,name:"foo"},{id:2,name:"bar"}];
const newObject = { id: 1, name: "baz" };
const replacedIndex = arr.findIndex((el) => el.id === newObject.id);
arr[replacedIndex] = newObject;
console.log(arr)
您可以轻松地从数组中找到要替换的对象的索引,并将新对象分配给找到的索引。
答案 2 :(得分:0)
如果要创建新数组,请使用filter
:
const newArr = arr.filter(item => item.id !== obj.id);
如果要更改现有数组,可以使用findIndex
查找条目,然后使用splice
:
const index = arr.findIndex(item => item.id == obj.id);
if (index !== -1) {
arr.splice(index, 1);
}
请注意,这假定只有一个条目匹配。如果可能有多个匹配项,我将向后遍历数组:
for (let index = arr.length - 1; index >= 0; --index) {
const item = arr[index];
if (item.id == obj.id) {
arr.splice(index, 1);
}
}
后退非常重要,因为当您splice
时,将以下条目向前移一个。
答案 3 :(得分:0)
这是我的解决方法
const arr = [{ id: 1, name: "foo" }, { id: 2, name: "bar" }];
const obj = { id: 1, name: "baz" };
function removeObjBasedID(arr, obj) {
for (let idx in arr) {
if (arr[idx].id === obj.id) {
arr.splice(idx, 1, obj);
return arr;
}
}
}
console.log(removeObjBasedID(arr, obj));
它保留原始数组的顺序。
答案 4 :(得分:-1)
如果您不在乎位置,请使用es6
let arr = [{ id: 1, name: "foo" }, { id: 2, name: "bar" }]
let obj = { id: 1, name: "baz" }
arr = [obj, ...arr.filter(i => i.id !== obj.id)]