I have an array of objects, Where I need to compare "taskId" & "resourceId" of its own array of objects and push the result in a new array. Here is my array
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"
}
]
Please help me to build this logic. I appreciate your efforts in advance.
Create a new method filterArray
to filter the array.
function filterArray(dataArray, resourceId, taskId){
return dataArray.filter(item => item.resourceId === resourceId && item.taskId === taskId)
}
The filter
method on the array will loop through each item in the dataArray
, compare the values of resourceId
and taskId
and if they matches, push them to the new array. This new array is returned from the method.
You can now call this method to filter:
let filteredArray = filterArray(data, 1234, 5001)
filteredArray
will now contain all items with resourceId = 1234
and taskId = 5001
1- Your JSON array isn't well formatted.
2- As per your expected outcome in comments, basically you need those data which have multiple occurrences only. So here is how you can get:
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)
You can use 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));
This will result the new array as shown below, you can modify the key name(array names) as required
JS Fiddle: https://jsfiddle.net/2cpe3ts6/
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.