0

这是我的答案,这是错误的,但我不知道为什么。逻辑似乎很好,但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);

}
4

2 回答 2

2

编辑:我弄乱了变量名: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 分开,以了解有多少答案是正确的、不正确的或空的,甚至可以为每个选项动态分配值

于 2020-06-04T15:19:15.423 回答
2

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相同索引 ( ) 处的相应项目进行比较并适当评分。假设缺少的答案是空字符串而不是其他任何内容(您的问题似乎暗示了这一点)。qIdxstudentResponse[qIdx]

于 2020-06-04T15:23:32.330 回答