Как я могу преобразовать следующий массив объектов? - PullRequest
1 голос
/ 29 февраля 2020

У меня примерно 1 час, чтобы попытаться выполнить следующее упражнение, поэтому я посмотрел, и мне стало интересно, может ли кто-нибудь помочь мне с этим.

Вот массив, который я получаю из базы данных 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
  }
]

Мне бы хотелось, чтобы это было так ... У меня есть некоторые функции (Math.round ...), чтобы просто генерировать случайные данные для проверки с помощью нужной мне панели инструментов. заполнить.

Изображение преобразования

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

На мой взгляд, это немного продвинуто для меня, я думаю, что мне нужно больше знаний о структурах данных в этом язык, не нужно рассказывать мне все решение, только с чего начать и некоторые шаги.

Ответы [ 3 ]

1 голос
/ 29 февраля 2020

Вы можете взять объект для группировки и получить значения из него как массив объектов.

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; }
0 голосов
/ 29 февраля 2020

Посмотрите на 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);
0 голосов
/ 29 февраля 2020

Необходимо выполнить итерацию по 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;
}

Не проверено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...