Reputation: 1993
I want to Add/Replace the object
from array of objects
by testing some properties
against array object
Replace object if name and id matches
Add object
to the array if name and id does not match from array objects
I am using below code, its working fine but I am not sure is it a good solution.
let arr = [{name: 'test1', id:1, data: {a:1} }, {name:'test2', id:2, data: {a:2}}]
let obj = {name:'test3', id:3, data: {a:3}}
let itemFound = false;
let newArr = arr.map((item)=>{
let test = item.name === obj.name && item.id === obj.id;
if(test){
itemFound = true;
}
return test ? obj : item;
});
if(!itemFound){
newArr.push(obj);
}
console.log(newArr)
Upvotes: 9
Views: 16810
Reputation: 1398
Wraping @Nina Scholz 's answer in a function
objectReplacer(arrayOfObjects, newObject) {
let index = arrayOfObjects.findIndex((value) => value === newObject.value);
if (index === -1) {
arrayOfObjects.push(newObject);
} else {
arrayOfObjects[index] = newObject;
}
}
Upvotes: 1
Reputation: 1955
You can use Array.prototype.find()
let arr = [{name: 'test1', id:1, data: {a:1} }, {name:'test2', id:2, data: {a:2}}]
let obj = {name:'test3', id:3, data: {a:3}}
const newArr = arr.slice();
const existingObj = newArr.find(item => item.name === obj.name && item.id === obj.id);
if(existingObj) {
Object.assign(existingObj, obj);
} else {
newArr.push(obj)
}
console.log(newArr)
Upvotes: 0
Reputation: 386634
You could look for the index and update the array, if found or push the object.
var array = [{ name: 'test1', id: 1, data: { a: 1 } }, { name: 'test2', id: 2, data: { a: 2 } }],
object = { name: 'test3', id: 3, data: { a: 3 } },
index = array.findIndex(({ name, id }) => name === object.name && id === object.id);
if (index === -1) {
array.push(object);
} else {
array[index] = object;
}
console.log(array);
Upvotes: 17