Estoy creando una API y obteniendo los datos de mi base de datos en el formato dado.
No habrá repeticiones como {country: 'India', count: 2, status: 'Active'},{country: 'India', count: 1, status: 'Active'}
const dataFromDB = [ {country: 'India', count: 2, status: 'Active'}, {country: 'USA', count: 3, status: 'Recovered'}, {country: 'India', count: 2, status: 'Recovered'}, {country: 'Russia', count: 1, status: 'Active'}, {country: 'India', count: 1, status: 'Dead'}, {country: 'Brazil', count: 1, status: 'Active'}, {country: 'Canada', count: 1, status: 'Dead'}, {country: 'USA', count: 1, status: 'Active'} ]
Pero quiero convertir mis datos a un formato diferente antes de enviarlos.
const formatIWant = { Brazil: { active: 1, dead: 0, recovered: 0 }, Canada: { active: 0, dead: 1, recovered: 0 }, India: { active: 2, dead: 1, recovered: 2 }, Russia: { active: 1, dead: 0, recovered: 0 }, USA: { active: 1, dead: 0, recovered: 3 } }
¿Cómo abordo este problema?
Puedes usar .reduce()
const dataFromDB = [ {country: 'India', count: 2, status: 'Active'}, {country: 'USA', count: 3, status: 'Recovered'}, {country: 'India', count: 2, status: 'Recovered'}, {country: 'Russia', count: 1, status: 'Active'}, {country: 'India', count: 1, status: 'Dead'}, {country: 'Brazil', count: 1, status: 'Active'}, {country: 'Canada', count: 1, status: 'Dead'}, {country: 'USA', count: 1, status: 'Active'} ]; const defaultStatus = dataFromDB.reduce((acc, {status}) => acc.hasOwnProperty(status.toLowerCase()) ? acc : {...acc, [status.toLowerCase()]: 0} , {}); const result = dataFromDB.reduce((acc, value)=> { const country = value.country.toLowerCase(); const status = value.status.toLowerCase(); return { ...acc, [country]: { ...defaultStatus, ...acc[country], [status]: value.count } } }, {}); console.log(result);
Para convertir los datos al formato deseado, podemos crear un objeto, formatIWant
, luego iterar a través de dataFromDB
, actualizando ese objeto con los datos relevantes a medida que avanzamos.
Aquí hay una implementación simple que producirá el resultado que está buscando.
const dataFromDB = [ {country: 'India', count: 2, status: 'Active'}, {country: 'USA', count: 3, status: 'Recovered'}, {country: 'India', count: 2, status: 'Recovered'}, {country: 'Russia', count: 1, status: 'Active'}, {country: 'India', count: 1, status: 'Dead'}, {country: 'Brazil', count: 1, status: 'Active'}, {country: 'Canada', count: 1, status: 'Dead'}, {country: 'USA', count: 1, status: 'Active'} ] const formatIWant = {}; for(let i=0; i<dataFromDB.length; i++){ let country = dataFromDB[i].country; let count = dataFromDB[i].count; let status = dataFromDB[i].status; // add entry for country if not found !formatIWant[country] ? formatIWant[country] = { active: 0, dead: 0, recovered: 0 } : ''; // update country with data formatIWant[country][status.toLowerCase()] = count; } console.log(formatIWant);
Simplemente recorra la array
de objects
simples y cree un nuevo objeto con diferentes claves usando cada dato. esto por ejemplo
const reformat = (dataFromDB) => { const formatted = {}; for (const data of dataFromDB) { formatted[data.country] = { recovered: 0, active: 0, dead: 0, ...formatted[data.country], [data.status.toLowerCase()]: data.count, }; } return formatted; }; console.log( reformat([ { country: 'India', count: 2, status: 'Active' }, { country: 'USA', count: 3, status: 'Recovered' }, { country: 'India', count: 2, status: 'Recovered' }, { country: 'Russia', count: 1, status: 'Active' }, { country: 'India', count: 1, status: 'Dead' }, { country: 'Brazil', count: 1, status: 'Active' }, { country: 'Canada', count: 1, status: 'Dead' }, { country: 'USA', count: 1, status: 'Active' }, ]) );