Как разбить объект на несколько объектов на основе данных в одном из его значений [уникальные значения в массиве] - PullRequest
0 голосов
/ 14 марта 2020

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

Входные данные:

data=[{"StudentID":["1","1","1","1","2","2","2","2","3","3","3","3","4","4","4","4"],
    "ModuleCode:"DES3095-N",
    "WeekNum":["1","2","3","4","1","2","3","4","1","2","3","4","1","2","3","4"],
    "Status":["p","p","pdg","p","abs","cc","p","abs","p","p","abs","p","p","abs","abs","abs"]}]

Вывод, который я пытаюсь достичь:

[{"StudentID":1,"ModuleCode:"DES3095-N","WeekNum":["1","2","3","4"],"Status":["p","p","pdg","p"]}
{"StudentID":2,"ModuleCode:"DES3095-N","WeekNum":["1","2","3","4"],"Status":["abs","cc","p","abs"]}
{"StudentID":3,"ModuleCode:"DES3095-N","WeekNum":["1","2","3","4"],"Status":["p","p","abs","p"]}
{"StudentID":4,"ModuleCode:"DES3095-N","WeekNum":["1","2","3","4"],"Status":["p","abs","abs","abs"]}]

Моя конечная цель здесь - построить график средней посещаемости студент для данного модуля, используя D3. js. PS Исходный набор данных намного больше.

1 Ответ

0 голосов
/ 14 марта 2020

Хорошо, это немного странная структура данных (данные - это один объект в массиве - поэтому не ясно, так ли это всегда, или если вы ожидаете несколько объектов в этом массиве), но давайте посмотрим, что мы можем сделать:

const data = [
    {
    "StudentID":["1","1","1","1","2","2","2","2","3","3","3","3","4","4","4","4"],
    "ModuleCode": "DES3095-N",
    "WeekNum":["1","2","3","4","1","2","3","4","1","2","3","4","1","2","3","4"],
    "Status":["p","p","pdg","p","abs","cc","p","abs","p","p","abs","p","p","abs","abs","abs"]
    }/*,
    {
    "StudentID":["1","1","1","1","2","2","2","2","3","3","3","3","4","4","4","4"],
    "ModuleCode": "DES4095-P",
    "WeekNum":["1","2","3","4","1","2","3","4","1","2","3","4","1","2","3","4"],
    "Status":["p","p","pdg","p","abs","cc","p","abs","p","p","abs","p","p","abs","abs","abs"]
    }*/
  ];
    
/* The Goal output is:
[{"StudentID":1,"ModuleCode:"DES3095-N","WeekNum":["1","2","3","4"],"Status":["p","p","pdg","p"]},
{"StudentID":2,"ModuleCode:"DES3095-N","WeekNum":["1","2","3","4"],"Status":["abs","cc","p","abs"]},
{"StudentID":3,"ModuleCode:"DES3095-N","WeekNum":["1","2","3","4"],"Status":["p","p","abs","p"]},
{"StudentID":4,"ModuleCode:"DES3095-N","WeekNum":["1","2","3","4"],"Status":["p","abs","abs","abs"]}]
*/

//The code to achieve that:
function aggregateData(data){
  const output = [];  
  for (let obj of data){
    let temp_arr = []; //incase we have multiple objects in our data array
    for (let key in obj){
      if (Array.isArray(obj[key])){
        //console.log('array', obj[key])
        if (key == "StudentID"){
          let temp_index = 0;
          for (let item of obj[key]){
            if (item != temp_index){
              temp_arr.push({"studentID": item})
              temp_index = parseInt(item);
            }
          }          
        } else{ //not studentID
          let temp_index = 0;
          for (let i = 0; i < obj[key].length; i++){
            temp_index = parseInt(obj["StudentID"][i]);
            if (temp_arr[temp_index - 1].hasOwnProperty(key)){
              temp_arr[temp_index - 1][key].push(obj[key][i]);
            } else {
              temp_arr[temp_index - 1][key] = [obj[key][i]];
            }            
          }            
        }
      } else {
        //console.log('string', obj[key])+
        for (let i = 0; i < temp_arr.length; i++){
          if (temp_arr[i].hasOwnProperty(key)){
            temp_arr[i][key].push(obj[key]);
          } else {
            temp_arr[i][key] = obj[key];
          }            
        } 
      }
    }
    output.push(temp_arr);
  }
  return output;
}

console.log(aggregateData(data));

Вывод:

[
  [
    {"StudentID":1,"ModuleCode:"DES3095-N","WeekNum":["1","2","3","4"],"Status":["p","p","pdg","p"]},
    {"StudentID":2,"ModuleCode:"DES3095-N","WeekNum":["1","2","3","4"],"Status":["abs","cc","p","abs"]},
    {"StudentID":3,"ModuleCode:"DES3095-N","WeekNum":["1","2","3","4"],"Status":["p","p","abs","p"]},
    {"StudentID":4,"ModuleCode:"DES3095-N","WeekNum":["1","2","3","4"],"Status":["p","abs","abs","abs"]}
  ]
]

Обратите внимание, что он обернут в еще один массив, чем вы хотели в вашем вопросе, потому что не ясно, если ваш массив данных будет иметь более одного элемента или нет (то есть, может быть, для другого кода модуля или чего-то еще), поэтому я сделал его как можно более общим.

Например, если у нас есть это в качестве ввода:

const data = [
    {
    "StudentID":["1","1","1","1","2","2","2","2","3","3","3","3","4","4","4","4"],
    "ModuleCode": "DES3095-N",
    "WeekNum":["1","2","3","4","1","2","3","4","1","2","3","4","1","2","3","4"],
    "Status":["p","p","pdg","p","abs","cc","p","abs","p","p","abs","p","p","abs","abs","abs"]
    },
    {
    "StudentID":["1","1","1","1","2","2","2","2","3","3","3","3","4","4","4","4"],
    "ModuleCode": "DES4095-P",
    "WeekNum":["1","2","3","4","1","2","3","4","1","2","3","4","1","2","3","4"],
    "Status":["p","p","pdg","p","abs","cc","p","abs","p","p","abs","p","p","abs","abs","abs"]
    }
  ];

Затем мы получаем это как вывод (т. Е. Массив для каждого ModuleCode):

[
  [
    {"StudentID":1,"ModuleCode:"DES3095-N","WeekNum":["1","2","3","4"],"Status":["p","p","pdg","p"]},
    {"StudentID":2,"ModuleCode:"DES3095-N","WeekNum":["1","2","3","4"],"Status":["abs","cc","p","abs"]},
    {"StudentID":3,"ModuleCode:"DES3095-N","WeekNum":["1","2","3","4"],"Status":["p","p","abs","p"]},
    {"StudentID":4,"ModuleCode:"DES3095-N","WeekNum":["1","2","3","4"],"Status":["p","abs","abs","abs"]}
  ],
  [
    {"StudentID":1,"ModuleCode:"DES4095-P","WeekNum":["1","2","3","4"],"Status":["p","p","pdg","p"]},
    {"StudentID":2,"ModuleCode:"DES4095-P","WeekNum":["1","2","3","4"],"Status":["abs","cc","p","abs"]},
    {"StudentID":3,"ModuleCode:"DES4095-P","WeekNum":["1","2","3","4"],"Status":["p","p","abs","p"]},
    {"StudentID":4,"ModuleCode:"DES4095-P","WeekNum":["1","2","3","4"],"Status":["p","abs","abs","abs"]}
  ]
]

Мы можем сделать это чище, сначала конвертировав в Map, а затем с помощью некоторого фильтра карты уменьшить функции, но это делает работу тоже.

...