JS使用.includes方法校验测验答案匹配嵌套数组正确答案失败如何解决
问题原因分析
- 直接对
correctAnswers外层数组调用includes()不生效的原因:外层数组的元素包含子数组类型,includes()执行的是严格相等匹配(===),只会判断用户输入是否和外层数组的某一个完整元素相等,不会递归遍历子数组内部的元素,自然无法匹配到嵌套在子数组里的正确答案。 - 单独调用
correctAnswers[3].includes(answer)无效果的常见原因:- 类型不匹配:输入框拿到的用户答案是字符串类型,部分正确答案是数字类型(比如第2题的
8、第6题的365),includes()的严格匹配会认为字符串"8"和数字8不相等。 - 输入格式问题:用户可能输入时带了前后空格、大小写和标准答案不一致,比如输入
" audi "和标准答案"Audi"会被判定为不相等。
- 类型不匹配:输入框拿到的用户答案是字符串类型,部分正确答案是数字类型(比如第2题的
解决方案
首先封装一个通用的单题答案校验函数,自动适配单答案/多答案嵌套场景,同时兼容输入格式和类型差异:
/** * 校验单题答案是否正确 * @param {number} questionIndex 题目下标 * @param {string} userInput 用户输入的答案 * @returns {boolean} 是否答对 */ function checkAnswer(questionIndex, userInput) { const standard = correctAnswers[questionIndex]; // 统一预处理用户输入:去前后空格+转小写 const processedInput = userInput.trim().toLowerCase(); // 处理多答案嵌套数组场景 if (Array.isArray(standard)) { // 只要命中任意一个正确答案即返回true return standard.some(item => { // 标准答案也转成字符串、小写后匹配,消除类型、大小写差异 return item.toString().toLowerCase() === processedInput; }); } // 处理单答案场景 return standard.toString().toLowerCase() === processedInput; }
完整的答题统计逻辑参考:
// 初始化正确题数 let numberCorrect = 0; const totalQuestions = quizQuestions.length; // 遍历所有题目完成校验 for (let i = 0; i < totalQuestions; i++) { const userAnswer = document.querySelector(`#input${i}`).value; if (checkAnswer(i, userAnswer)) { numberCorrect++; } } // 全部答对的提示逻辑 if (numberCorrect === totalQuestions) { document.getElementById("correct").innerHTML = "All answers are correct"; }
内容的提问来源于stack exchange,提问作者Herman Vulkers
相关产品推荐
相关产品推荐

