简体   繁体   English

如何转换下一个对象数组?

[英]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.我有大约 1 小时的时间尝试做下一个练习,所以我被看了看,我想知道是否有人可以帮助我。

Here is the array that I get from the Database Base Array Image这是我从 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.我想要这样...我有一些 (Math.round...) 函数只是为了生成随机数据以使用我想要填充的仪表板进行测试。

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.您必须遍历response并用数据填充premiere

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:查看Array.reduce以迭代响应并构建一个新数组:

 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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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