I have a value events which is a list of lists with maps that look like this:
[
[
{
"packageId": "2721",
"eventTime": "2022-03-15T11:24:12.200864Z",
"type": "created",
"id": 831,
"createdAt": "2022-03-15T11:24:12.200864Z",
"createdBy": "47"
}
],
[
{
"packageId": "2738",
"eventTime": "2022-03-15T11:24:12.200864Z",
"type": "created",
"id": 832,
"createdAt": "2022-03-15T11:24:12.200864Z",
"createdBy": "47"
}
],
[
{
"packageId": "2721",
"eventTime": "2022-03-20T16:25:00Z",
"type": "deviated-manually-overridden",
"id": 842,
"createdAt": "2022-03-20T16:26:00.363630Z",
"createdBy": "47"
},
{
"packageId": "2721",
"eventTime": "2022-03-20T16:38:00Z",
"type": "deviated-manually-overridden",
"id": 844,
"createdAt": "2022-03-20T16:38:46.352751Z",
"createdBy": "47"
},
{
"packageId": "2721",
"eventTime": "2022-03-20T20:31:00Z",
"type": "collected-manually-overridden",
"id": 846,
"createdAt": "2022-03-20T20:32:18.046346Z",
"createdBy": "47"
},
{
"packageId": "2721",
"eventTime": "2022-03-15T11:24:12.200864Z",
"type": "created",
"id": 829,
"createdAt": "2022-03-15T11:24:12.200864Z",
"createdBy": "47"
}
],
[
{
"packageId": "2738",
"eventTime": "2022-03-20T16:25:00Z",
"type": "deviated-manually-overridden",
"id": 843,
"createdAt": "2022-03-20T16:26:00.363630Z",
"createdBy": "47"
},
{
"packageId": "2738",
"eventTime": "2022-03-20T16:38:00Z",
"type": "deviated-manually-overridden",
"id": 845,
"createdAt": "2022-03-20T16:38:46.352751Z",
"createdBy": "47"
},
{
"packageId": "2738",
"eventTime": "2022-03-15T11:24:12.200864Z",
"type": "created",
"id": 830,
"createdAt": "2022-03-15T11:24:12.200864Z",
"createdBy": "47"
}
],
[
{
"packageId": "2721",
"eventTime": "2022-03-15T11:24:12.200864Z",
"type": "created",
"id": 833,
"createdAt": "2022-03-15T11:24:12.200864Z",
"createdBy": "47"
}
],
[
{
"packageId": "2738",
"eventTime": "2022-03-15T11:24:12.200864Z",
"type": "created",
"id": 834,
"createdAt": "2022-03-15T11:24:12.200864Z",
"createdBy": "47"
}
]
]
I would like to group this list inside of a list by map's packageId, so that every map with the same packageId is part of one list. At the same time I would also like to filter out the maps that have the same packageId, type and eventTime, so that I have only one of each with the same values of those fields.
What I want to achieve is this:
[
[
{
"packageId": "2721",
"eventTime": "2022-03-15T11:24:12.200864Z",
"type": "created",
"id": 831,
"createdAt": "2022-03-15T11:24:12.200864Z",
"createdBy": "47"
},
{
"packageId": "2721",
"eventTime": "2022-03-20T16:25:00Z",
"type": "deviated-manually-overridden",
"id": 842,
"createdAt": "2022-03-20T16:26:00.363630Z",
"createdBy": "47"
},
{
"packageId": "2721",
"eventTime": "2022-03-20T16:38:00Z",
"type": "deviated-manually-overridden",
"id": 844,
"createdAt": "2022-03-20T16:38:46.352751Z",
"createdBy": "47"
},
{
"packageId": "2721",
"eventTime": "2022-03-20T20:31:00Z",
"type": "collected-manually-overridden",
"id": 846,
"createdAt": "2022-03-20T20:32:18.046346Z",
"createdBy": "47"
}
],
[
{
"packageId": "2738",
"eventTime": "2022-03-15T11:24:12.200864Z",
"type": "created",
"id": 832,
"createdAt": "2022-03-15T11:24:12.200864Z",
"createdBy": "47"
},
{
"packageId": "2738",
"eventTime": "2022-03-20T16:25:00Z",
"type": "deviated-manually-overridden",
"id": 843,
"createdAt": "2022-03-20T16:26:00.363630Z",
"createdBy": "47"
},
{
"packageId": "2738",
"eventTime": "2022-03-20T16:38:00Z",
"type": "deviated-manually-overridden",
"id": 845,
"createdAt": "2022-03-20T16:38:46.352751Z",
"createdBy": "47"
}
]
]
I am not sure how can I achieve that kind of data structure with groupBy or filter. I have tried with:
events.groupBy(listOfEvents => listOfEvents.map(e => e.get('packageId')))
But, that is obviously not working. How can I do this?
Update:
I have tried with creating a Map based on answer suggestions:
const grouped = Map<string, List<Event>>()
events.map(list => list.map(event => {
const packageId = event?.get('packageId')
console.log('packageId ', packageId)
if (packageId) {
console.log('grouped packageId: ', grouped.get(packageId))
if (!grouped.get(packageId)) {
grouped.set(packageId, List<Event>())
}
const updatedList = grouped.get(packageId)?.push(event)
console.log('updatedList: ', updatedList)
if (updatedList) grouped.set(packageId, updatedList)
console.log('grouped: ', grouped)
}
}))
console.log('grouped ', grouped)
But, this is not setting any value into Map, I see that packageId is logged, but everything else is undefined and grouped is of size 0. What am I doing wrong here?
One method would be transfer everything into an object using
packageIdas key, during that process generate anidfor each object based on it'spackageId,typeandeventTime, ignore it if thatidalready has been transferred and than extract it's values into array:P.S. This can be visually simplified by using
Array.map()instead offorloops, but it will be slightly slower.