比较两个数组并在项目匹配时生成点



这是我的答案,这是错误的,但我无法弄清楚为什么。逻辑似乎很好,但我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);
}

编辑:我搞砸了变量名称:P

对我来说,将映射中的函数逻辑和化简分开似乎更容易。

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
}

您还可以将地图和归约分开,以了解正确、不正确或空的答案,甚至可以为每个选项动态分配值

reduce中的curr只是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]并适当地得分。假设缺少的答案是一个空字符串而不是其他任何东西(您的问题似乎暗示了这一点(。

相关内容

  • 没有找到相关文章