I have information coming in as a Map in Javascript.
I want to sort it based on types I have set as an enum.
The data looks like this:
Map(5)
{"Adopted" => 105, "Pending" => 176, "Missing" => 3, "InterestedParties" => 45, "WaitingForPickup" => 15}
Though it may make more sense when seen this way:
new Map<string, number>([
['Adopted', 105],
['Pending', 176],
['Missing', 3],
['InterestedParties', 45],
['WaitingForPickup', 15],
]);
I want to sort this data into categories like "unadopted animals", "homed animals", "Unknown status", so I made a group of data that map to enum types (so AnimalStatusType.Pending is "Pending")
const metricGroups = {
unAdopted: [
AnimalStatusType.Pending,
AnimalStatusType.InterestedParties,
],
adopted: [
AnimalStatusType.Adopted,
],
unknown: [
AnimalStatusType.Missing,
AnimalStatusType.WaitingForPickup
],
}
I want to end up with my Map sorted by the three different categories adopted, unadopted, and unknown to look something like this:
{
adopted: [['adopted', 105]],
unadopted: [['pending', 176],['interestedParties', 45]],
unknown: [ ['missing', 3],['waitingForPickup', 15]],
}
but I'm having a bit of difficulty finding anything that does the mapping properly. I think maybe combining Array.from or a reduce functionality can work, but searching mostly pulls up Javascript's .map functionality which is not helping.
const GroupedData = Array.from(animalData).reduce((acc, metric) => {
acc[metricGroups[metric]].push(metric)
})
You could just simply reduce your metricGroups object and map the enum values to the appropriate key-value pair in the input.
Note that you cannot sort an object's keys.
const AnimalStatusType = {
Adopted: 'adopted',
InterestedParties: 'interestedParties',
Missing: 'missing',
Pending: 'pending',
WaitingForPickup: 'waitingForPickup'
};
const metricGroups = {
unAdopted: [
AnimalStatusType.Pending,
AnimalStatusType.InterestedParties,
],
adopted: [
AnimalStatusType.Adopted,
],
unknown: [
AnimalStatusType.Missing,
AnimalStatusType.WaitingForPickup
],
};
const input = { 'Adopted': 105, 'Pending': 176, 'Missing': 3, 'InterestedParties': 45, 'WaitingForPickup': 15 };
const capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1);
const result = Object.entries(metricGroups)
.reduce((acc, [key, value]) => ({
...acc,
[key]: value.map(v => [v, input[capitalize(v)]])
}), {});
console.log(result);
.as-console-wrapper { top: 0; max-height: 100% !important; }
You can do this with map and Object.entries/Object.fromEntries
const input = new Map([
['Adopted', 105],
['Pending', 176],
['Missing', 3],
['InterestedParties', 45],
['WaitingForPickup', 15],
]);
const metricGroups = {
unAdopted: [
"Pending",
"InterestedParties",
],
adopted: [
"Adopted",
],
unknown: [
"Missing",
"WaitingForPickup"
],
}
const result = Object.fromEntries(Object.entries(metricGroups).map(([key, values]) => {
return [
key,
values.map(value => ([value, input.get(value)]))
]
}));
console.log(result);