很抱歉,如果我的标题令人困惑,这很难解释。
我创建了一个多项选择考试。当用户提交考试时,会收集答案并将其放入如下数组中:
userSubmittedAnswers = [
['c'], // Q.1
['d'], // Q.2
['a', 'b', 'c', 'd'], // Q.3
['b'], // Q.4
['c', 'd'], // Q.5
['d'], // Q.6
]
此数组中名为answers的每个数组都包含多项选择中每个问题的已提交答案。一些答案有超过1个可用答案,因此问题3和5例如具有多于1个值。
此数组被发送到服务器,我想将它与具有正确答案的类似数组进行比较:
correctAnswers = [
['d'], // Q.1
['d'], // Q.2
['a', 'b', 'c'], // Q.3
['b'], // Q.4
['c', 'd'], // Q.5
['d'], // Q.6
]
我想要实现的是将提交的答案与正确答案进行比较,但要确保我计算了多少嵌套数组不正确并跟踪它们以便我可以在客户端上向用户突出显示它们。我不确定最好的方法是什么......任何建议都非常感激
答案 0 :(得分:1)
您可以使用reduce()
和every()
并返回错误答案和错误答案总数的对象。
var userSubmittedAnswers = [
['c'], // Q.1
['d'], // Q.2
['a', 'b', 'c', 'd'], // Q.3
['b'], // Q.4
['c', 'd'], // Q.5
['d'], // Q.6
]
var correctAnswers = [
['d'], // Q.1
['d'], // Q.2
['a', 'b', 'c'], // Q.3
['b', 'a'], // Q.4
['c', 'd'], // Q.5
['d'], // Q.6
]
//Loop SubmittedAnswers array (result, currentElement, index)
var result = userSubmittedAnswers.reduce(function(r, e, i) {
//First check if both array with same index are equal in length if they are continue with every check else return false.
var check = (e.length == correctAnswers[i].length) ? true : false;
//Loop current element or array or e with every() that will return true or false if every element is found in element with same index inside correctAnswers array
if (check) {
check = e.every(function(a) {
return correctAnswers[i].indexOf(a) != -1;
});
}
//If check return false add that Q+(index+1) to incorrect array and increment total incorrect answers
if (!check) {
r.incorrect = (r.incorrect || []).concat('Q.' + (i + 1));
r.total = (r.total || 0) + 1;
}
return r;
}, {})
console.log(result)

答案 1 :(得分:1)
我会这样做:
使用forEach
循环浏览userSubmittedAnswers
(编辑:将其更改为reduce
,因为建议将所有突变(在此处使用result
)保留在回调本地{ em> - 在answering to a question here时学习它。)
计算result
正确/错误答案的数量/列表,并且包含表单元素的数组有助于将数据绑定到html标记(例如,如果您使用的是AngularJS) :
{
"correct": false,
"answer": [
"c"
]
}
见下面的演示:
var userSubmittedAnswers=[["c"],["d"],["a","b","c","d"],["b"],["c","d"],["d"]];
var correctAnswers=[["d"],["d"],["a","b","c"],["b"],["c","d"],["d"]];
var result = {correctNo: 0, incorrectNo: 0,
correct: [], incorrect: [], details: []};
userSubmittedAnswers.forEach(function(element, index) {
var answer = {};
// check if the answer is correct
answer.correct = element.every(function(elem) {
return correctAnswers[index].indexOf(elem) !== -1;
});
// track the number of correct & incorrect answers
if(answer.correct) {
this.correctNo++;
this.correct.push(index+1);
} else {
this.incorrectNo++;
this.incorrect.push(index+1);
}
// accumulate the details
answer.answer = element;
this.details.push(answer);
}, result);
console.log(result);

.as-console-wrapper{top:0;max-height:100%!important;}

编辑回答:
var userSubmittedAnswers=[["c"],["d"],["a","b","c","d"],["b"],["c","d"],["d"]];
var correctAnswers=[["d"],["d"],["a","b","c"],["b"],["c","d"],["d"]];
var result = userSubmittedAnswers.reduce(function(arr, element, index, array) {
var answer = {};
// check if the answer is correct
answer.correct = element.every(function(elem) {
return correctAnswers[index].indexOf(elem) !== -1;
});
// track the number of correct & incorrect answers
if(answer.correct) {
arr.correctNo++;
arr.correct.push(index + 1);
} else {
arr.incorrectNo++;
arr.incorrect.push(index + 1);
}
// accumulate the details
answer.answer = element;
arr.details.push(answer);
return arr;
}, {correctNo: 0, incorrectNo: 0, correct: [], incorrect: [], details: []});
console.log(result);

.as-console-wrapper{top:0;max-height:100%!important;}

答案 2 :(得分:0)
您可以将子数组转换为字符串以使比较更容易:
var results = serSubmittedAnswers.map((item, index) => item.join("") === correctAnswers[index].join("") ? 0 : 1);
console.log(results.reduce((a,b) => a+b) + " bad answers");
results.forEach((item, index) => {
if (item === 1) console.log("Q" + (index+1))
}); // 2 bad answers
// Q1
// Q3