这是我的答案,它是错误的,但我不知道为什么。逻辑似乎不错,但我的 acc
在大多数时候都是返回一个比预期更大的数字。
问题是这样的。
第一个输入数组包含了一个考试的正确答案, 比如["a", "a", "b", "d"]. 第二个是 "答案 "数组,包含学生的答案。
这两个数组不是空的,而且长度相同。返回这个答案数组的得分,每一个正确答案给+4,每一个错误答案给-1,每一个空白答案(空字符串)给+0。
我的答案。
function checkExam(array1, array2) {
return array1.concat(array2).reduce((acc, curr, i) =>
curr[i] === curr[i + array1.length] ? acc + 4 : curr[i + array1.length] === '' ? acc + 0 : acc - 1, 0);
}
EDIT: 我把变量名搞乱了 :P
在我看来,将函数的逻辑分离在map和reduce中更容易。
const checkExam = (correctExam, answer) => {
const total = correctExam.map((it, i) => {
if(it === answer[i]){ return 4 }
else if(answer[i] === ""){ return 0 }
else{ return -1 }
}).reduce((acc, curr) => acc + curr, 0)
return total
}
你也可以把map和reduce分开来知道多少答案是正确的,不正确的或空的,甚至可以动态地给每个选项赋值。
curr
在你的reduce函数中,只是这次reduce函数迭代中的当前项,而不是原始数组。既然你知道这两个数组的长度是一样的,那么连接就没有任何意义了,因为你只会在迭代答案时浪费周期。像这样的方法应该是可行的。
var correct = ["a", "b", "b", "c"];
var answers = ["a", "", "d", "c"];
function checkExam(answerKey, studentResponse) {
return answerKey.reduce((score, answer, qIdx) => {
if (answer === studentResponse[qIdx]) {
score += 4;
}
else if (studentResponse[qIdx] !== '') {
score -= 1;
}
return score;
}, 0);
}
console.log(checkExam(correct, answers));
这里我们将遍历答案键 (answerKey
)和每项(answer
)与同一索引的相应项目进行比较(qIdx
)在另一个数组中 studentResponse[qIdx]
并适当地进行评分。假设缺失的答案是一个空字符串,而不是其他东西(你的问题似乎暗示了这一点)。