如果数组中存在类似的项,请移除并添加它,否则只需推送它
If similar item exists in array remove and then add it , else just push it
我有两个数组,一个存储许多项,另一个只有一个项要检查。两个数组都有相同的参数,但我想在新数组上检查两个参数"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>');
相关文章:
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 正在将事件处理程序添加到不存在的类
- 如何添加函数中存在的所有参数
- 将事件侦听器添加到文档,而不是签入元素存在,然后添加事件侦听器
- underline-js:将键对象与数组键对象进行比较,如果存在,则移除现有的添加新的
- 如果存在特定类,请不要添加类
- Javascript代码添加了一些不应该存在的内容
- jQuery appendTo 替换元素而不是添加元素,如果正在添加的元素预先存在于列表中
- jQuery脚本,它搜索现有的查询参数并且不添加“"如果存在
- 如何确保我的值已添加并存在,然后运行另一个代码jquery
- 是否存在添加两个相同事件处理程序的默认行为
- 将Cs添加到具有特定类但存在多个类名的元素中
- 嵌入多对多关系-如果一个新对象还不存在,则添加一个新的对象
- javascript/jquery将尾部斜杠添加到url(如果不存在)
- jQuery:添加和删除<br>标签,这取决于窗口宽度以及标签是否已经存在
- 如果存在跨度,则将类添加到链接
- Node.js Express应用程序:如果存在cookie,则从服务器端向元素添加CSS类
- 如果数组中存在类似的项,请移除并添加它,否则只需推送它
- 将新选项值动态添加到选择框中(如果尚未存在)
- 如果存在多个现有值,则向文本区域值添加分隔符 (Javascript)