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?
CodePudding user response:
Try this
var grouped {};
var lists = [
[
{
"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"
}
]
]
lists.map(list=>list.map(byPack=>{
if (!grouped[byPack.packageId]){
grouped[byPack.packageId]=[];
}
grouped[byPack.packageId].push(byPack);
});
console.log(grouped);
CodePudding user response:
One method would be transfer everything into an object using packageId
as key, during that process generate an id
for each object based on it's packageId
, type
and eventTime
, ignore it if that id
already has been transferred and than extract it's values into array:
const data = [
[
{
"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"
}
]
];
let groups = {};
for(let i = 0, filter = {}; i < data.length; i )
{
for(let j = 0; j < data[i].length; j )
{
const d = data[i][j],
id = d.packageId "_" d.type "_" d.eventTime;
if (id in filter)
continue;
filter[id] = "";
if (!groups[d.packageId])
groups[d.packageId] = [];
groups[d.packageId].push(d);
}
}
groups = Object.values(groups);
console.log(groups);
P.S.
This can be visually simplified by using Array.map()
instead of for
loops, but it will be slightly slower.