问题排查:为何multipleAnswer[z]无法赋值为中间数组的值?
问题:无法将多选答案赋值到数组
multipleAnswer中 尝试将multipleAnswer[z]的值设置为中间数组multipleAnswerIntermediary的内容,但赋值操作没有效果。打印代码运行过程中的值后,确认问题出在赋值环节。这段代码的作用是收集页面中所有问题的答案,汇总到Answer(单选答案)和multipleAnswer(多选答案)两个数组中。
原JavaScript代码
document.getElementById("SubmitButton").onclick = function(e) { let Answer = []; let multipleAnswer = []; e.preventDefault(); const questionCounter = questions.length; var z = 0; for (x in questions) { const radioGroup = document.getElementById("answers" + z + ""); const selectedValue = radioGroup.value; let multipleAnswerIntermediary = []; if (questions[x]["multipleCorrectAnswers"]) { for (y in questions[x]["answers"][z]) { const multipleAnswerSelector = document.getElementById("multipleanswer" + questions[x]["id"] + "a" + y) const multipleAnswerValue = multipleAnswerSelector.checked; multipleAnswerIntermediary[y] = multipleAnswerValue; console.log(multipleAnswer[z]) console.log(multipleAnswerIntermediary) } multipleAnswer[z] = multipleAnswerIntermediary; console.log(multipleAnswer[z]) } console.log(multipleAnswer[z]) Answer[z] = selectedValue; z = z + 1; console.log(z) console.log(selectedValue) console.log(Answer[z]) console.log(questions[x]) console.log(Answer) } }
生成的HTML示例
<sl-card class="kortele card-header card-footer" style="clear:both; --width: 0px;"> <div slot="header" class="korteles-headeris" style="display: flex; align-items: center; justify-content: space-between; font-weight: 500; padding-left: 20px; padding-right: 20px;"> <div> Question <strong style="font-weight: 400; font-size: var(--sl-font-size-large);">1</strong>/<sub style="font-size: var(--sl-font-size-medium); font-weight: 400;">4</sub> </div> <div style="font-size: var(--sl-font-size-medium); font-weight: 400;"> Points: <strong>20</strong> </div> </div> <div class="question-list"> <div class="question-column"> <h3>What are the correct steps of Risk Management?</h3> </div> <div class="question-column"> <ul id="answerstext0"> <li><strong>A</strong>: Identify, evaluate, prioritize, minimize, control & monitor risk</li> <li><strong>B</strong>: Evaluate, prioritize, identify, minimize, control & monitor risk</li> <li><strong>C</strong>: Control & monitor, minimize, identify, prioritize, evaluate risk</li> <li><strong>D</strong>: Prioritize, identify, minimize, evaluate, control & monitor risk</li> </ul> </div> </div> <div slot="footer"> <sl-radio-group id="answers0" name="a" style="display: flex; justify-content: center; " value="" form="" data-optional="" data-valid=""> <sl-radio-button pill="" size="medium" name="0" value="0" role="presentation" class="sl-button-group__button sl-button-group__button--first sl-button-group__button--radio">A</sl-radio-button> <sl-radio-button pill="" size="medium" name="0" value="1" role="presentation" class="sl-button-group__button sl-button-group__button--inner sl-button-group__button--radio">B</sl-radio-button> <sl-radio-button pill="" size="medium" name="0" value="2" role="presentation" class="sl-button-group__button sl-button-group__button--inner sl-button-group__button--radio">C</sl-radio-button> <sl-radio-button pill="" size="medium" name="0" value="3" role="presentation" class="sl-button-group__button sl-button-group__button--last sl-button-group__button--radio">D</sl-radio-button> </sl-radio-group> <div class="multipleanswers" id="multipleanswers0"></div> </div> </sl-card> <sl-card class="kortele card-header card-footer" style="clear:both; --width: 0px;"> <div slot="header" class="korteles-headeris" style="display: flex; align-items: center; justify-content: space-between; font-weight: 500; padding-left: 20px; padding-right: 20px;"> <div> Question <strong style="font-weight: 400; font-size: var(--sl-font-size-large);">2</strong>/<sub style="font-size: var(--sl-font-size-medium); font-weight: 400;">4</sub> </div> <div style="font-size: var(--sl-font-size-medium); font-weight: 400;"> Points: <strong>20</strong> </div> </div> <div class="question-list"> <div class="question-column"> <h3>What are the goals of Risk Management?</h3> </div> <div class="question-column"> <ul id="answerstext1"> <li><strong>A</strong>: Radiation resistance</li> <li><strong>B</strong>: Turning tiny</li> <li><strong>C</strong>: lLiLli blast</li> </ul> </div> </div> <div slot="footer"> <sl-radio-group id="answers1" name="a" style="display: flex; justify-content: center; " value="" form="" data-optional="" data-valid=""> <sl-radio-button pill="" size="medium" name="1" value="0" role="presentation" class="sl-button-group__button sl-button-group__button--first sl-button-group__button--radio">A</sl-radio-button> <sl-radio-button pill="" size="medium" name="1" value="1" role="presentation" class="sl-button-group__button sl-button-group__button--inner sl-button-group__button--radio">B</sl-radio-button> <sl-radio-button pill="" size="medium" name="1" value="2" role="presentation" class="sl-button-group__button sl-button-group__button--last sl-button-group__button--radio">C</sl-radio-button> </sl-radio-group> <div class="multipleanswers" id="multipleanswers1"></div> </div> </sl-card> <sl-card class="kortele card-header card-footer" style="clear:both; --width: 0px;"> <div slot="header" class="korteles-headeris" style="display: flex; align-items: center; justify-content: space-between; font-weight: 500; padding-left: 20px; padding-right: 20px;"> <div> Question <strong style="font-weight: 400; font-size: var(--sl-font-size-large);">3</strong>/<sub style="font-size: var(--sl-font-size-medium); font-weight: 400;">4</sub> </div> <div style="font-size: var(--sl-font-size-medium); font-weight: 400;"> Points: <strong>20</strong> </div> </div> <div class="question-list"> <div class="question-column"> <h3>Multiple correct answers?</h3> </div> <div class="question-column"> <ul id="answerstext2"> <li><strong>A</strong>: Radiation resistance</li> <li><strong>B</strong>: Turning tiny</li> <li><strong>C</strong>: lLiLli blast</li> </ul> </div> </div> <div slot="footer"> <sl-radio-group id="answers2" name="a" style="display: flex; justify-content: center; " value="" form="" data-optional="" data-valid=""></sl-radio-group> <div class="multipleanswers" id="multipleanswers2"> <sl-checkbox id="multipleanswer2a0" size="medium" form="" data-optional="" data-valid="">A</sl-checkbox> <sl-checkbox id="multipleanswer2a1" size="medium" form="" data-optional="" data-valid="">B</sl-checkbox> <sl-checkbox id="multipleanswer2a2" size="medium" form="" data-optional="" data-valid="">C</sl-checkbox> </div> </div> </sl-card> <sl-card class="kortele card-header card-footer" style="clear:both; --width: 0px;"> <div slot="header" class="korteles-headeris" style="display: flex; align-items: center; justify-content: space-between; font-weight: 500; padding-left: 20px; padding-right: 20px;"> <div> Question <strong style="font-weight: 400; font-size: var(--sl-font-size-large);">4</strong>/<sub style="font-size: var(--sl-font-size-medium); font-weight: 400;">4</sub> </div> <div style="font-size: var(--sl-font-size-medium); font-weight: 400;"> Points: <strong>20</strong> </div> </div> <div class="question-list"> <div class="question-column"> <h3>What is happening two?</h3> </div> <div class="question-column"> <ul id="answerstext3"> <li><strong>A</strong>: Radiation resistance</li> <li><strong>B</strong>: Turning tiny</li> <li><strong>C</strong>: lLiLli blast</li> </ul> </div> </div> <div slot="footer"> <sl-radio-group id="answers3" name="a" style="display: flex; justify-content: center; " value="" form="" data-optional="" data-valid=""> <sl-radio-button pill="" size="medium" name="3" value="0" role="presentation" class="sl-button-group__button sl-button-group__button--first sl-button-group__button--radio">A</sl-radio-button> <sl-radio-button pill="" size="medium" name="3" value="1" role="presentation" class="sl-button-group__button sl-button-group__button--inner sl-button-group__button--radio">B</sl-radio-button> <sl-radio-button pill="" size="medium" name="3" value="2" role="presentation" class="sl-button-group__button sl-button-group__button--last sl-button-group__button--radio">C</sl-radio-button> </sl-radio-group> <div class="multipleanswers" id="multipleanswers3"></div> </div> </sl-card>
问题分析与解决方案
核心问题
- 循环索引混乱:使用
for (x in questions)遍历问题数组,但同时维护独立的z变量作为索引,若questions的键与z不同步(比如数组有非连续索引时),会导致对应关系错误。 - 多选答案遍历错误:
questions[x]["answers"][z]中,x已经是当前问题的索引/键,再叠加z会导致遍历错误的数组,应该直接使用questions[x]["answers"](或改用索引遍历后用questions[z]["answers"])。 - 无元素存在性判断:若DOM元素未找到,会导致脚本中断,后续赋值操作无法执行。
修正后的代码
document.getElementById("SubmitButton").onclick = function(e) { let Answer = []; let multipleAnswer = []; e.preventDefault(); // 改用索引遍历,确保z与问题索引严格对应 for (let z = 0; z < questions.length; z++) { const currentQuestion = questions[z]; const radioGroup = document.getElementById("answers" + z); const selectedValue = radioGroup.value; let multipleAnswerIntermediary = []; if (currentQuestion.multipleCorrectAnswers) { // 遍历当前问题的所有选项,而非嵌套索引 for (let y = 0; y < currentQuestion.answers.length; y++) { const multipleAnswerSelector = document.getElementById(`multipleanswer${currentQuestion.id}a${y}`); // 避免元素不存在导致的错误 if (multipleAnswerSelector) { multipleAnswerIntermediary[y] = multipleAnswerSelector.checked; } } // 赋值多选答案 multipleAnswer[z] = multipleAnswerIntermediary; } // 赋值单选答案 Answer[z] = selectedValue; } // 调试用,确认结果 console.log("单选答案:", Answer); console.log("多选答案:", multipleAnswer); }
关键修改点
- 把
for (x in questions)改为for (let z = 0; z < questions.length; z++),直接用索引遍历,避免索引不同步问题。 - 用
currentQuestion = questions[z]获取当前问题,简化后续属性访问。 - 遍历多选选项时,直接使用
currentQuestion.answers.length作为循环范围,而非错误的嵌套索引。 - 增加元素存在性判断,避免因DOM元素未找到导致的脚本中断。
- 移除冗余的调试日志,保留最终结果的打印,方便验证。
内容的提问来源于stack exchange,提问作者Team TGL
相关产品推荐
相关产品推荐

