繁体   English   中英

如何将单个对象数组与其键值进行比较

[英]How do I compare single array of objects with it key values

我有一个对象数组,我需要比较它自己的对象数组的“taskId”和“resourceId”并将结果推送到一个新数组中。 这是我的数组

data = [{
  "resourceId":1234
  "taskId":5001
  "taskName":"Test task1"
 },
 {
  "resourceId":1234
  "taskId":5001
  "taskName":"Test task2"
}
{
 "resourceId":1234
 "taskId":5002
 "taskName":"Test task3"
},
{
 "resourceId":1234
 "taskId":5001
 "taskName":"Test task4"
},
{
 "resourceId":5678
 "taskId":5003
 "taskName":"Test task5"
},
{
 "resourceId":5678
 "taskId":5004
 "taskName":"Test task6"
}
]

请帮我建立这个逻辑。 我提前感谢您的努力。

创建一个新方法filterArray来过滤数组。

function filterArray(dataArray, resourceId, taskId){
   return dataArray.filter(item => item.resourceId === resourceId && item.taskId === taskId)
}

数组上的filter方法将遍历dataArray中的每个项目,比较resourceIdtaskId的值,如果它们匹配,则将它们推送到新数组。 这个新数组是从方法返回的。

您现在可以调用此方法进行过滤:

let filteredArray = filterArray(data, 1234, 5001)

filteredArray数组现在将包含所有resourceId = 1234taskId = 5001的项目

1- 您的 JSON 数组格式不正确。

2-根据您在评论中的预期结果,基本上您需要那些仅出现多次的数据。 因此,您可以通过以下方式获得:

 var data = [{ "resourceId":1234, "taskId":5001, "taskName":"Test task1" }, { "resourceId":1234, "taskId":5001, "taskName":"Test task2" }, { "resourceId":1234, "taskId":5002, "taskName":"Test task3" }, { "resourceId":1234, "taskId":5001, "taskName":"Test task4" }, { "resourceId":5678, "taskId":5003, "taskName":"Test task5" }, { "resourceId":5678, "taskId":5004, "taskName":"Test task6" } ]; const result = []; data.forEach((item) => { let dupes = data.filter((elem) => elem.resourceId == item.resourceId && elem.taskId == item.taskId); if (dupes.length >1) { result.push(item); } }); console.log(result);

 data = [{ "resourceId":1234, "taskId":5001, "taskName":"Test task1" }, { "resourceId":1234, "taskId":5001, "taskName":"Test task2" }, { "resourceId":1234, "taskId":5002, "taskName":"Test task3" }, { "resourceId":1234, "taskId":5001, "taskName":"Test task4" }, { "resourceId":5678, "taskId":5003, "taskName":"Test task5" }, { "resourceId":5678, "taskId":5004, "taskName":"Test task6" } ] var result=[]; data.map(x=>{ var i=result.findIndex(y=> y.resourceId==x.resourceId && y.taskId==x.taskId ); if( i == -1){ result.push( { "resourceId":x.resourceId,"taskId":x.taskId,"taskName":x.taskName } ) }else{ result[i].taskName += " "+x.taskName; } }) console.log(result)

 data = [{ "resourceId":1234, "taskId":5001, "taskName":"Test task1" }, { "resourceId":1234, "taskId":5001, "taskName":"Test task2" }, { "resourceId":1234, "taskId":5002, "taskName":"Test task3" }, { "resourceId":1234, "taskId":5001, "taskName":"Test task4" }, { "resourceId":5678, "taskId":5003, "taskName":"Test task5" }, { "resourceId":5678, "taskId":5004, "taskName":"Test task6" } ] var result=[]; data.map(x=>{ var i=result.findIndex(y=> y.resourceId==x.resourceId && y.taskId==x.taskId ); if( i == -1){ result.push( { "resourceId":x.resourceId,"taskId":x.taskId,"taskName":[x.taskName] } ) }else{ result[i].taskName.push( x.taskName); } }) console.log(result)

您可以使用https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

var result = data.reduce(function (r, a) {
    var value = a.resourceId.toString().concat(a.taskId);
    r[value] = r[value] || [];
    r[value].push(a);
    return r;
}, Object.create(null));

这将产生如下所示的新数组,您可以根据需要修改键名(数组名)

在此处输入图像描述

JS小提琴: https://jsfiddle.net/2cpe3ts6/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM