Хорошо, это немного странная структура данных (данные - это один объект в массиве - поэтому не ясно, так ли это всегда, или если вы ожидаете несколько объектов в этом массиве), но давайте посмотрим, что мы можем сделать:
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, а затем с помощью некоторого фильтра карты уменьшить функции, но это делает работу тоже.