简体   繁体   中英

How can I transform the next object array?

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.

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

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.

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>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM