对两个数组进行比较,当项目匹配时,产生积分。

问题描述 投票:0回答:1

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

}
javascript arrays concat reduce whiteboard
1个回答
2
投票

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分开来知道多少答案是正确的,不正确的或空的,甚至可以动态地给每个选项赋值。


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)与同一索引的相应项目进行比较(qIdx)在另一个数组中 studentResponse[qIdx] 并适当地进行评分。假设缺失的答案是一个空字符串,而不是其他东西(你的问题似乎暗示了这一点)。

© www.soinside.com 2019 - 2024. All rights reserved.