如何对比两个array.map输出的数据,实现考生考试成绩自动计算
评分功能实现方案
问题修正
你原有代码中遍历participants1时属性名拼写错误,学生答案存储在elem.answers中,不是elem.answer,这会导致你无法拿到学生的作答数据。另外map方法适用于生成新数组,若仅需遍历打印日志,使用forEach更合理。
核心实现思路
你不需要构造两个转换对象,仅需将标准答案数组预处理为以题目ID为键的索引对象即可,一次预处理所有学生都可以复用,比对答案时可以直接O(1)取值,性能和可读性都更好。
完整实现代码
// 1. 预处理标准答案为索引表,key为题目id,value存储正确答案和对应分值 const answerKeyMap = answerKey.reduce((acc, question) => { acc[question.id] = { correct: question.answerKey, score: question.score } return acc }, {}) // 2. 遍历所有学生,计算得分 const participantsWithScore = participants1.map(student => { let totalScore = 0 // 遍历所有考题,逐一比对答案 answerKey.forEach(question => { const qid = question.id // 学生该题答案和正确答案匹配则加分 if (student.answers[qid] === answerKeyMap[qid].correct) { totalScore += answerKeyMap[qid].score } }) // 返回扩展了总分属性的学生信息 return { ...student, totalScore } }) // 测试输出结果 console.log(participantsWithScore) /* 输出结果中两名学生的得分分别为30、50,符合预期 */
常见问题说明
- 如何正确访问
elem.id/elem.answerKey/elem.score属性:answerKey数组的每一项本身就携带这些属性,直接遍历数组即可正常访问,你原有写法没有问题,只是没有利用返回值做后续处理。 - 有没有更简便的实现:上述实现就是生产环境常用的最简方案,不需要引入额外依赖,逻辑清晰,就算后续题目量、学生量大幅提升也能保持不错的性能。
内容的提问来源于stack exchange,提问作者Vincentius Heri
相关产品推荐
相关产品推荐

