将元素替换为Javascript中对象数组中搜索到的值



具有以下对象数组:

const input = [ {id: 3, data: {name: 'john'} },
{id: 6, data: {name: 'mike'} },
{id: 2, data: {name: 'anna'} }
];

我想写一个接收新对象的方法,如果对象的id在数组中,它会用新对象替换那个对象,否则它会创建一个新对象。

例如,如果该方法接收到这个对象:{id: 1, data: {name: 'maria' }},它将把它添加到数组中,所以数组看起来像:

const input = [ {id: 3, data: {name: 'john'} },
{id: 6, data: {name: 'mike'} },
{id: 2, data: {name: 'anna'} },
{id: 2, data: {name: 'maria'} }
];

如果它接收到{id: 3, data: {name: 'jack' }},它应该用id=3替换对象,因此结果将是:

const input = [ {id: 3, data: {name: 'jack'} },
{id: 6, data: {name: 'mike'} },
{id: 2, data: {name: 'anna'} },
{id: 2, data: {name: 'maria'} }
];

代码:

function doMagic(input, newObj) {
if (input.some(el => el.id === newObj.id) {
// replace it
} else {
// add the object to the array
}
}

您可以这样做:

function doMagic(input, newObj) {
const i = input.findIndex(element => element.id === newObj.id);
if (i > -1) input[i] = newObj; 
else input.push(newObj);
}
const input = [ {id: 3, data: {name: 'jack'} },
{id: 6, data: {name: 'mike'} },
{id: 2, data: {name: 'anna'} }
];
newObj = {id: 1, data: {name: 'maria' }};
oldObj = {id: 3, data: {name: 'john' }}
doMagic(input, newObj);
console.log(input);
doMagic(input, oldObj);
console.log(input);

function doMagic(input, newObj) {
input.map((el, i, arr) => {
if (input.some(el => el.id === newObj.id)) {
input.splice(i, 1, newObj);
} else {
input.push(newObj);
}
})
}

可以使用find((来检查它是否包含所需的对象。若数组包含对象,那个么我们可以通过object.assign((方法更新它。如果没有,那么我们只将此项推送到数组中。

const oneFunction = (arr, objToEdit) => {
let existingObject = arr.find(f => f.id === objToEdit.id 
&& f.data.name !== objToEdit.name);
if (existingObject) 
Object.assign(existingObject, objToEdit);
else 
arr.push(objToEdit)  
return arr;
}

一个例子:

const input = 
[ 
{id: 3, data: {name: 'john'} },
{id: 6, data: {name: 'mike'} },
{id: 2, data: {name: 'anna'} }
];
const oneFunction = (arr, objToEdit) => {
let existingObject = arr.find(f => f.id === objToEdit.id && f.data.name !== objToEdit.name);
if (existingObject) 
Object.assign(existingObject, objToEdit);
else 
arr.push(objToEdit)  
return arr;
}

let testObject = {id: 3, data: {name: 'john1'}};
console.log(oneFunction(input, testObject))

最新更新