如果数组中存在类似的项目删除然后添加它,否则只需按下它

时间:2016-03-24 05:00:09

标签: javascript

我有两个数组,一个存储很多项目,另一个只有一个要检查的项目。 两个数组都有相同的参数,但我想检查新数组的两个参数" TaskId"和#34; 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'}];

此处第一项已更新。

4 个答案:

答案 0 :(得分:0)

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

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;

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

答案 1 :(得分:0)

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

console.log(mainArray);

不是更快,而是简单。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

&#13;
&#13;
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>');
&#13;
&#13;
&#13;