如果数组中存在类似的项,请移除并添加它,否则只需推送它

If similar item exists in array remove and then add it , else just push it

本文关键字:添加 存在 数组 如果      更新时间:2023-09-26

我有两个数组,一个存储许多项,另一个只有一个项要检查。两个数组都有相同的参数,但我想在新数组上检查两个参数"TaskId"answers"ResourceId",如果这两个参数与主数组匹配,我想删除然后添加新数组。

例如:

var mainArray = [{'Name':'Ticket1','TaskId':'b5de781e-9d25-49e7-af6d-3e254e894c04','ResourceId':'977dacf0-0b61-413e-a9a4-b469ab30d1b1',
'Status':'Completed'},{'Name':'Ticket2','TaskId':'c5ae581e-9f25-49e7-af6d-3e254e894c04','ResourceId':'37fdadf1-0b61-413e-a9a4-b469ab30d1b1',
'Status':'InProgress'},{'Name':'Ticket3','TaskId':'45af551e-9f25-49e7-af6d-3e254e894c04','ResourceId':'37fdadf1-0b61-413e-a9a4-b469ab30d1b1',
'Status':'InProgress'}];
var tmpArray = [{'TaskId':'b5de781e-9d25-49e7-af6d-3e254e894c04','ResourceId':'977dacf0-0b61-413e-a9a4-b469ab30d1b1','Status':'Pending'}];

在tmpArray中,总会有一个项目,

我想根据TaskId和ResourceId进行检查,如果类似的项在mainArray中匹配,那么删除该项并用新项更新它,或者可能只是用新项来更新它。

即,我的最终阵列应该像

 [{'Name':'Ticket1','TaskId':'b5de781e-9d25-49e7-af6d-3e254e894c04','ResourceId':'977dacf0-0b61-413e-a9a4-b469ab30d1b1',
'Status':'Pending'},{'Name':'Ticket2','TaskId':'c5ae581e-9f25-49e7-af6d-3e254e894c04','ResourceId':'37fdadf1-0b61-413e-a9a4-b469ab30d1b1',
'Status':'InProgress'},{'Name':'Ticket3','TaskId':'45af551e-9f25-49e7-af6d-3e254e894c04','ResourceId':'37fdadf1-0b61-413e-a9a4-b469ab30d1b1',
'Status':'InProgress'}];

此处更新了第一项。

假设您的临时数组中有一个项目要检查:

var item = tmpArray[0];

只需在主数组上迭代并检查是否匹配即可。如果找不到匹配项,则推送到数组。

function() {
  for (var i = 0; i < mainArray.length; i++) {
    if (arr[i].resourceID === item.resourceID && arr[i].taskID === item.taskID) {
      // DO STUFF 
      return;
    }
  }
  mainArray.push(item);
}

现在,如果找到匹配项,你到底想做什么还有点不清楚。假设您总是想用临时数组中的对象进行更新,那么您只需替换当前项:

arr[i] = item;

如果您只想针对某些参数,请明确更改它们:

arr[i].status = item.status;

如果要更改任意数量的参数,则必须迭代对象的参数并更改每个参数。

mainArray.forEach(function (ticket) {
    if (ticket.TaskId === tmpArray[0].TaskId && ticket.ResourceId === tmpArray[0].ResourceId)  {
        ticket.Status = tmpArray[0].Status;
    }
});
console.log(mainArray);

不是更快,而是简单。

MainArray看起来像一个数组数组。使用.pop循环遍历MainArray的每个项,直到每个项都是一个单独的数组,然后使用.shift循环遍历每个单独的数组以消除索引1。然后使用==运算符再次循环以查找匹配的数组。

由于短路,我建议使用Array#some()

function update(array, temp) {
    temp.forEach(function (a) {
        array.some(function (b, i, bb) {
            if (a.TaskId === b.TaskId && a.ResourceId === b.ResourceId) {
                bb[i] = a;
                return true;
            }
        }) || array.push(a);
    });
}
var mainArray = [{ 'Name': 'Ticket1', 'TaskId': 'b5de781e-9d25-49e7-af6d-3e254e894c04', 'ResourceId': '977dacf0-0b61-413e-a9a4-b469ab30d1b1', 'Status': 'Completed' }, { 'Name': 'Ticket2', 'TaskId': 'c5ae581e-9f25-49e7-af6d-3e254e894c04', 'ResourceId': '37fdadf1-0b61-413e-a9a4-b469ab30d1b1', 'Status': 'InProgress' }, { 'Name': 'Ticket3', 'TaskId': '45af551e-9f25-49e7-af6d-3e254e894c04', 'ResourceId': '37fdadf1-0b61-413e-a9a4-b469ab30d1b1', 'Status': 'InProgress' }],
    tmpArray = [{ 'TaskId': 'b5de781e-9d25-49e7-af6d-3e254e894c04', 'ResourceId': '977dacf0-0b61-413e-a9a4-b469ab30d1b1', 'Status': 'Pending' }];
update(mainArray, tmpArray);
document.write('<pre>' + JSON.stringify(mainArray, 0, 4) + '</pre>');