You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询:如何用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;
}

关键改动说明:

  1. 创建数组独立副本:用[...test]浅拷贝原始选项数组,这样每次打乱的都是全新的数组,不会互相干扰。
  2. 移除无效内层循环:直接给当前迭代的Quiz[i]赋值选项,不需要遍历整个已创建的测验数组。
  3. 优化正确答案逻辑(可选):如果希望正确答案是当前选项组里的有效元素,就从打乱后的选项里随机选;如果坚持要随机1-5,保留你原来的Math.floor((Math.random() * 5) + 1)即可。
  4. 修正数组赋值方式:直接把打乱后的数组赋值给options,比错误的push赋值更直接合理。

运行这段代码后,每个测验项都会有独立的随机打乱选项,不会出现所有选项组内容一致的问题。

内容的提问来源于stack exchange,提问作者Alan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:36:46