Tengo información que ingresa como un Mapa en Javascript.
Quiero ordenarlo según los tipos que he establecido como una enumeración.
Los datos se ven así:
Mapa(5)
{"Adopted" => 105, "Pending" => 176, "Missing" => 3, "InterestedParties" => 45, "WaitingForPickup" => 15}Aunque puede tener más sentido cuando se ve de esta manera:
new Map<string, number>([ ['Adopted', 105], ['Pending', 176], ['Missing', 3], ['InterestedParties', 45], ['WaitingForPickup', 15], ]); Quiero clasificar estos datos en categorías como "animales no adoptados", "animales domiciliados", "Estado desconocido", así que hice un grupo de datos que se asignan a tipos de enumeración (por lo que AnimalStatusType.Pending es "Pendiente")
const metricGroups = { unAdopted: [ AnimalStatusType.Pending, AnimalStatusType.InterestedParties, ], adopted: [ AnimalStatusType.Adopted, ], unknown: [ AnimalStatusType.Missing, AnimalStatusType.WaitingForPickup ], }Quiero terminar con mi Mapa ordenado por las tres categorías diferentes adoptadas, no adoptadas y desconocidas para que se vea así:
{ adopted: [['adopted', 105]], unadopted: [['pending', 176],['interestedParties', 45]], unknown: [ ['missing', 3],['waitingForPickup', 15]], } pero tengo un poco de dificultad para encontrar algo que haga el mapeo correctamente. Creo que tal vez combinar Array.from o una funcionalidad de reducción puede funcionar, pero la búsqueda en su mayoría muestra la funcionalidad .map de Javascript que no está ayudando.
const GroupedData = Array.from(animalData).reduce((acc, metric) => { acc[metricGroups[metric]].push(metric) })Simplemente podría reducir su objeto metricGroups y asignar los valores de enumeración al par clave-valor apropiado en el input .
Tenga en cuenta que no puede ordenar las claves de un objeto.
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; }Puede hacer esto con map y 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);