使用javascript(Nodejs)对重构json进行分组



我在团队中遇到了麻烦(在我的案例中,我尝试了reduce和foreach(,但在构建时,我似乎在某个地方失败了。

结构背后的逻辑是,连续评估由(测试、测验(组成,考试由其自身组成。

备注是根据条件从持续评估和考试的总给出

->每个学生都有自己的

->我正在使用javascript(nodejs(

这是数据(JSON(

{
"studentCode": "22001",
"studentMarkSystemName": "CAT 1",
"studentMark": 10,
"maxMark": 30,
"markType": "Test"
},
{
"studentCode": "1111",
"studentMarkSystemName": "CAT 1",
"studentMark": 20,
"maxMark": 30,
"markType": "Test"
},
{
"studentCode": "1111",
"studentMarkSystemName": "EXAM",
"studentMark": 40,
"maxMark": 50,
"markType": "Exam"
},
{
"studentCode": "22001",
"studentMarkSystemName": "EXAM",
"studentMark": 42,
"maxMark": 50,
"markType": "Exam"
},
{
"studentCode": "22001",
"studentMarkSystemName": "Quiz 1",
"studentMark": 5,
"maxMark": 5,
"markType": "Quiz"
},
{
"studentCode": "1111",
"studentMarkSystemName": "Quiz 1",
"studentMark": 4,
"maxMark": 5,
"markType": "Quiz"
}

我想把它转换成

{
"studentCode": "22001",
"continousAssesment": 15,
"Exam":42,
"maxContinousAssement":35,
"maxExam": 50,
"total":57,
"remark": "pass"
}
{
"studentCode": "1111",
"continousAssesment": 24,
"Exam":40,
"maxContinousAssement":35,
"maxExam": 50,
"total": 64,
"remark": "pass"
}

在我这边,我已经尝试过了,但没有得到实际的格式,因为只需要按学生编码进行分组

var resultArrKeyHolder = [];
var resultArr = [];
data.forEach(function (item) {
resultArrKeyHolder[item.studentCode] =
resultArrKeyHolder[item.studentCode] || {};
var obj = resultArrKeyHolder[item.studentCode];
if (Object.keys(obj).length == 0) resultArr.push(obj);
obj.studentCode = item.studentCode;
obj.marks = obj.marks || [];
obj.marks.push({
studentMark: item.studentMark,
maxMark: item.maxMark,
markType: item.markType,
});
});

感谢你的帮助!

您可以使用哈希分组方法:

const data = [{"studentCode": "22001","studentMarkSystemName": "CAT 1","studentMark": 10,"maxMark": 30,"markType": "Test"},{"studentCode": "1111","studentMarkSystemName": "CAT 1","studentMark": 20,"maxMark": 30,"markType": "Test"},{"studentCode": "1111","studentMarkSystemName": "EXAM","studentMark": 40,"maxMark": 50,"markType": "Exam"},{"studentCode": "22001","studentMarkSystemName": "EXAM","studentMark": 42,"maxMark": 50,"markType": "Exam"},{"studentCode": "22001","studentMarkSystemName": "Quiz 1","studentMark": 5,"maxMark": 5,"markType": "Quiz"},{"studentCode": "1111","studentMarkSystemName": "Quiz 1","studentMark": 4,"maxMark": 5,"markType": "Quiz"}];
const emptyCounters = {continousAssesment:0,Exam:0,maxContinousAssement:0,maxExam:0,total:0};
const result = Object.values(data.reduce((acc, {studentCode: code, ...rest}) => {
acc[code] ??= { studentCode: code, ...emptyCounters };
if (rest.markType === "Exam") {
acc[code].Exam += rest.studentMark;
acc[code].maxExam = Math.max(rest.maxMark, acc[code].maxExam)
} else {
acc[code].continousAssesment += rest.studentMark;
acc[code].maxContinousAssement = Math.max(rest.maxMark, acc[code].maxContinousAssement)
}
acc[code].total += rest.studentMark;
acc[code].remark = acc[code].total > 50 ? "pass" : "not pass";

return acc;
}, {}));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0 }

最新更新