1

I have like 1 hour trying to do the next exercice, so I get looked and I was wondering If someone can help me with this.

Here is the array that I get from the Database Base Array Image

let response =
[{
    "name": "October : 2019",
    "userName": "Katherine Diaz",
    "newCases": 875,
    "recover": 8
  },
  {
    "name": "December : 2019",
    "userName": "Katherine Diaz",
    "newCases": 503,
    "recover": 38
  },
  {
    "name": "November : 2019",
    "userName": "Katherine Diaz",
    "newCases": 227,
    "recover": 14
  },
  {
    "name": "November : 2019",
    "userName": "Belyini Cabral",
    "newCases": 19,
    "recover": 14
  },
  {
    "name": "January : 2020",
    "userName": "Katherine Diaz",
    "newCases": 272,
    "recover": 123
  },
  {
    "name": "October : 2019",
    "userName": "Belyini Cabral",
    "newCases": 287,
    "recover": 1
  },
  {
    "name": "October : 2019",
    "userName": "N/A",
    "newCases": 3,
    "recover": 0
  },
  {
    "name": "January : 2020",
    "userName": "Mercedes Perez",
    "newCases": 65,
    "recover": 0
  },
  {
    "name": "February : 2020",
    "userName": "N/A",
    "newCases": 76,
    "recover": 0
  },
  {
    "name": "December : 2019",
    "userName": "N/A",
    "newCases": 136,
    "recover": 0
  },
  {
    "name": "November : 2019",
    "userName": "Mercedes Perez",
    "newCases": 15,
    "recover": 0
  },
  {
    "name": "January : 2020",
    "userName": "N/A",
    "newCases": 299,
    "recover": 0
  },
  {
    "name": "December : 2019",
    "userName": "Mercedes Perez",
    "newCases": 44,
    "recover": 0
  },
  {
    "name": "October : 2019",
    "userName": "Mercedes Perez",
    "newCases": 323,
    "recover": 0
  },
  {
    "name": "December : 2019",
    "userName": "Belyini Cabral",
    "newCases": 0,
    "recover": 11
  },
  {
    "name": "January : 2020",
    "userName": "Belyini Cabral",
    "newCases": 0,
    "recover": 11
  },
  {
    "name": "February : 2020",
    "userName": "Mercedes Perez",
    "newCases": 0,
    "recover": 20
  },
  {
    "name": "February : 2020",
    "userName": "Belyini Cabral",
    "newCases": 0,
    "recover": 9
  },
  {
    "name": "February : 2020",
    "userName": "Katherine Diaz",
    "newCases": 0,
    "recover": 43
  }
]

I would like to have like this... I have some (Math.round...) functions just to generate random data to test with a dashboard that I want to fill.

Transformation Image

            let premiere = [
            {
                name : 'October',
                user : ['Katherine Diaz', 'Belyini Cabral', 'Mercedes Perez', 'N/A'],
                newCases : [
                    Math.round(Math.random()*1000),
                    Math.round(Math.random()*1000),
                    Math.round(Math.random()*1000),
                    Math.round(Math.random()*1000)
                ],
                recovered :[
                    Math.round(Math.random()*800),
                    Math.round(Math.random()*800),
                    Math.round(Math.random()*800),
                    Math.round(Math.random()*800)
                ],
                monthRecovered : Math.round(Math.random()*800),
                monthNewCases : Math.round(Math.random()*1000)
            },
            {
                name : 'November',
                user : ['Katherine Diaz', 'Belyini Cabral', 'Mercedes Perez', 'N/A'],
                newCases : [
                    Math.round(Math.random()*1000),
                    Math.round(Math.random()*1000),
                    Math.round(Math.random()*1000),
                    Math.round(Math.random()*1000)
                ],
                recovered :[
                    Math.round(Math.random()*800),
                    Math.round(Math.random()*800),
                    Math.round(Math.random()*800),
                    Math.round(Math.random()*800)
                ],
                monthRecovered : Math.round(Math.random()*800),
                monthNewCases : Math.round(Math.random()*1000)
            },
            {
                name : 'December',
                user : ['Katherine Diaz', 'Belyini Cabral', 'Mercedes Perez', 'N/A'],
                newCases : [
                    Math.round(Math.random()*1000),
                    Math.round(Math.random()*1000),
                    Math.round(Math.random()*1000),
                    Math.round(Math.random()*1000)
                ],
                recovered :[
                    Math.round(Math.random()*800),
                    Math.round(Math.random()*800),
                    Math.round(Math.random()*800),
                    Math.round(Math.random()*800)
                ],
                monthRecovered : Math.round(Math.random()*800),
                monthNewCases : Math.round(Math.random()*1000)
            },
            {
                name : 'January',
                user : ['Katherine Diaz', 'Belyini Cabral', 'Mercedes Perez', 'N/A'],
                newCases : [
                    Math.round(Math.random()*1000),
                    Math.round(Math.random()*1000),
                    Math.round(Math.random()*1000),
                    Math.round(Math.random()*1000)
                ],
                recovered :[
                    Math.round(Math.random()*800),
                    Math.round(Math.random()*800),
                    Math.round(Math.random()*800),
                    Math.round(Math.random()*800)
                ],
                monthRecovered : Math.round(Math.random()*800),
                monthNewCases : Math.round(Math.random()*1000)
            },
            {
                name : 'February',
                user : ['Katherine Diaz', 'Belyini Cabral', 'Mercedes Perez', 'N/A'],
                newCases : [
                    Math.round(Math.random()*1000),
                    Math.round(Math.random()*1000),
                    Math.round(Math.random()*1000),
                    Math.round(Math.random()*1000)
                ],
                recovered :[
                    Math.round(Math.random()*800),
                    Math.round(Math.random()*800),
                    Math.round(Math.random()*800),
                    Math.round(Math.random()*800)
                ],
                monthRecovered : Math.round(Math.random()*800),
                monthNewCases : Math.round(Math.random()*1000)
            }
        ];

As I see It, it's a little be advanced for me, I think I need more knowledge of data structures in this language, don't need to tell me the whole solution just where to start and some steps.

2
  • If you look at the "desired" data, it's one array entry per month, with the year data thrown away, so start by simply trying to use "a fresh array of objects called premiere " and input.forEach(e => ...) to create a list of distinct objects with the month as a name attribute and nothing else. Once you have that working, you can start building out that code. Commented Feb 29, 2020 at 17:38
  • 1
    Please don't post a link to a picture of code. You should also remove 80% of the code you are displaying to encourage people to read it. See stackoverflow.com/help/minimal-reproducible-example Commented Feb 29, 2020 at 17:38

3 Answers 3

1

You could take an object for grouping and get the values from it as array of objects.

var response = [{ name: "October : 2019", userName: "Katherine Diaz", newCases: 875, recover: 8 }, { name: "December : 2019", userName: "Katherine Diaz", newCases: 503, recover: 38 }, { name: "November : 2019", userName: "Katherine Diaz", newCases: 227, recover: 14 }, { name: "November : 2019", userName: "Belyini Cabral", newCases: 19, recover: 14 }, { name: "January : 2020", userName: "Katherine Diaz", newCases: 272, recover: 123 }, { name: "October : 2019", userName: "Belyini Cabral", newCases: 287, recover: 1 }, { name: "October : 2019", userName: "N/A", newCases: 3, recover: 0 }, { name: "January : 2020", userName: "Mercedes Perez", newCases: 65, recover: 0 }, { name: "February : 2020", userName: "N/A", newCases: 76, recover: 0 }, { name: "December : 2019", userName: "N/A", newCases: 136, recover: 0 }, { name: "November : 2019", userName: "Mercedes Perez", newCases: 15, recover: 0 }, { name: "January : 2020", userName: "N/A", newCases: 299, recover: 0 }, { name: "December : 2019", userName: "Mercedes Perez", newCases: 44, recover: 0 }, { name: "October : 2019", userName: "Mercedes Perez", newCases: 323, recover: 0 }, { name: "December : 2019", userName: "Belyini Cabral", newCases: 0, recover: 11 }, { name: "January : 2020", userName: "Belyini Cabral", newCases: 0, recover: 11 }, { name: "February : 2020", userName: "Mercedes Perez", newCases: 0, recover: 20 }, { name: "February : 2020", userName: "Belyini Cabral", newCases: 0, recover: 9 }, { name: "February : 2020", userName: "Katherine Diaz", newCases: 0, recover: 43 }],
    result = Object.values(response.reduce((object, { name, userName, newCases, recover }) => {
        if (!object[name]) object[name] = { name, user: [], newCases: [], recovered: [] };
        object[name].user.push(userName);
        object[name].newCases.push(newCases);
        object[name].recovered.push(recover);
        return object;
    }, {}));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

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

2 Comments

Ok, you got the right result that I was looking for, thanks for take part of your time to response... what kind of topic do you recommend me to review not to have the same problem in the future?
i don't get you.
0

You have to iterate through response and fill premiere with the data.

var response=... (same as in OP),
    premiere=[],
    keys={};
for(var i=0;i<response.length;i++) {
    var element=response[i];

    //Here you may parse element.name if you want to remove the year
    var name=element.name;

    //You'll need to keep track of where in premiere is each name
    var index;
    if(!keys.hasOwnProperty(name)) {
        //If name doesn't exist, create it (we'll populate it later)
        index=premiere.push({
            name:name,
            user:[],
            newCases:[],
            recovered:[],
            monthNewCases:0,
            monthRecovered:0
        })-1;
        //And store its index in keys
        keys[name]=index;
    } else {
        //If it exists, retreive its index to append new data
        index=keys[name];
    }      

    //Check if the user name exists to prevent duplicates
    //If it doesn't, push it
    if(premiere[name].user.indexOf(element.userName)<0) premiere[name].user.push(element.userName);

    premiere[name].newCases.push(element.newCases);
    premiere[name].recovered.push(element.recover);

    premiere[name].monthNewCases+=element.newCases;
    premiere[name].monthRecovered+=element.recover;
}

Not tested.

Comments

0

Look at Array.reduce to iterate over the response and build up a new array:

const response = [
  {
    "name": "October : 2019",
    "userName": "Katherine Diaz",
    "newCases": 875,
    "recover": 8
  },
  {
    "name": "December : 2019",
    "userName": "A guy named Jeff",
    "newCases": 503,
    "recover": 380
  },
  {
    "name": "December : 2019",
    "userName": "Patient Zero",
    "newCases": 999,
    "recover": 38
  },
];

const result = response.reduce((acc, item) => {
  // create a new entry for this item's name if it doesn't already exist
  const bin = acc[item.name] = acc[item.name] || { user: [], newCases: [], recovered: [] };

  // add the fields we care about to this entry
  bin.user.push(item.userName);
  bin.newCases.push(item.newCases);
  bin.recovered.push(item.recover);
  
  // return the updated accumulator for the next iteration
  return acc;
}, {})

document.getElementById('output').innerText = JSON.stringify(result, null, 2);
<pre id="output"></pre>

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.