0

I'm building an API and getting the data from my database in the given format.
There won't be repetitions like {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'}
]

But I want to convert my data into a different format before sending it out.

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
  }
}

How do I tackle this problem.

3 Answers 3

1

To convert the data into your desired format, we can create an object, formatIWant, then iterate through dataFromDB, updating that object with the relevant data as we go.

Here's a simple implementation that will yield the result you are looking for.

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);

Sign up to request clarification or add additional context in comments.

Comments

1

You can use .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);

Comments

0

Just loop thru the array of plain objects and create a new object with different keys using each data. This for example

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' },
  ])
);

3 Comments

but this will overwrite every country object and will give only last value?
Already updated it. Just added one line (the spread operator for existing values). Goodluck! You could also add default zero values for other keys if you want them to be. Just add the proper keys with zero values before the spread operator.
Made another update. I have already tested it

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.