咨询:如何用for循环创建含随机选项的Quiz数组?附JS代码
问题分析与修复方案
先拆解下你代码里的几个核心问题,再给出修复后的版本:
- 内层循环逻辑完全错误:你在外层循环的每一次迭代里,都遍历了整个
Quiz数组,还错误地写了push = test——这不是调用数组的push方法,而是给push属性赋值,会导致所有测验项的options被重复赋值,完全没必要遍历整个数组,你只需要给当前正在创建的Quiz[i]设置选项即可。 - 数组引用重复问题:
test是一个数组对象,你每次shuffle都是修改同一个数组,然后直接把它赋值给options,这会导致所有Quiz项的options都指向同一个内存地址的数组,最后所有项的选项内容都会变成最后一次打乱的结果。必须创建test的独立副本再处理。 push方法使用错误:push是数组的方法,要调用它得写push(元素),而不是给它赋值。
下面是修复后的代码,我标注了关键改动:
// 原始选项池 var test = [1, 2, 3, 4, 5]; var Quiz = []; for (var i = 0; i < 5; i++) { // 每次循环都创建test的独立副本,避免所有选项组共用同一个数组 var shuffledOptions = [...test]; shuffle(shuffledOptions); // 创建当前测验项:用独立的打乱选项,正确答案可选自当前选项池(更合理) Quiz[i] = { options: shuffledOptions, // 如果需要正确答案是当前选项里的有效项,用下面的写法;若要保留随机1-5,换回你原来的代码即可 correct: shuffledOptions[Math.floor(Math.random() * shuffledOptions.length)] }; } console.log(Quiz); function shuffle(arra1) { var ctr = arra1.length, temp, index; while (ctr > 0) { index = Math.floor(Math.random() * ctr); ctr--; temp = arra1[ctr]; arra1[ctr] = arra1[index]; arra1[index] = temp; } return arra1; }
关键改动说明:
- 创建数组独立副本:用
[...test]浅拷贝原始选项数组,这样每次打乱的都是全新的数组,不会互相干扰。 - 移除无效内层循环:直接给当前迭代的
Quiz[i]赋值选项,不需要遍历整个已创建的测验数组。 - 优化正确答案逻辑(可选):如果希望正确答案是当前选项组里的有效元素,就从打乱后的选项里随机选;如果坚持要随机1-5,保留你原来的
Math.floor((Math.random() * 5) + 1)即可。 - 修正数组赋值方式:直接把打乱后的数组赋值给
options,比错误的push赋值更直接合理。
运行这段代码后,每个测验项都会有独立的随机打乱选项,不会出现所有选项组内容一致的问题。
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

