循环返回非常长的数组,即使它循环3次?

时间:2016-07-02 10:11:16

标签: javascript html arrays random

下面我创建了两个循环。

基本上它首先遍历包含4个值的随机数发生器数组。然后随机生成一个介于0和3之间的数字,并以随机顺序选择randomizer数组中的一个值到console.log(例如2,0,3,1)。

下一个循环正在努力随机创建错误的答案。如果这个错误的答案在allAnswers数组中不存在,那么它会将其推送到数组。

然后循环并创建一个按钮,用户可以选择答案。

所有这一切都很完美。除了我的allAnswers数组返回13个值时,它应该只有4个(其中1个是我的预定值21)。

我需要它来创建4个按钮,每个按钮通过0-3之间的数组位置来回答并返回那些唯一值而不说未定义。所以我不确定在这种情况下我做错了什么?

var allAnswers = [21],
    randomizer = [0, 1, 2, 3],
    random = 0,
    buttonArea = $("#answerOptions");


for (randomizer, r = randomizer.length; r--; ) {

    random = randomizer.splice(Math.floor(Math.random() * (r + 1)), 1)[0];
    // console.log(random);

    // Generates 3 random wrong answers
    for(wa = 0 ; wa < 3; wa++) {
        wrongAnswers = Math.floor((Math.random() * 100) + 1);
    }

    // Pushes wrong answers to array
    if (allAnswers.indexOf(wrongAnswers) === -1) {
      allAnswers.push(wrongAnswers);
    }
    console.log(random);
    input = $('<div class="col-xs-6"><button class="btn btn-primary answerButton">'+ allAnswers[random] +'</button></div>');
    input.appendTo(buttonArea); 
}

console.log(allAnswers);

编辑:

在建议的新循环中添加

var goodAnswer = 21,
    allAnswers = [],
    wrongAnswer, 
    wa,
    buttonArea = $("#answerOptions");

for(wa = 0; wa < 4; wa++) {
  do {
    wrongAnswer = Math.floor((Math.random() * 100) + 1);
  } while(wrongAnswer == goodAnswer || allAnswers.indexOf(wrongAnswer) !== -1);

  allAnswers.push(wrongAnswer);

    input = $('<div class="col-xs-6"><button class="btn btn-primary answerButton">'+ allAnswers +'</button></div>');
    input.appendTo(buttonArea); 
}

allAnswers[Math.floor(Math.random() * 4)] = goodAnswer;

console.log(goodAnswer);
console.log(allAnswers);
console.log(wa);

1 个答案:

答案 0 :(得分:1)

你的'wa'循环没用:它为'wrongAnswers'分配了三次随机值。但最后,你只有一个值。

另一个问题是,如果'wrongAnswers'没有通过indexOf()条件,则没有'再试一次'。在这种情况下,没有任何内容插入到该迭代中。

我建议采用一种更简单的方法:构建一个包含4个随机错误答案的数组,并用好的答案替换其中一个。

var goodAnswer = 21,
    allAnswers = [],
    wrongAnswer, wa;

for(wa = 0; wa < 4; wa++) {
  do {
    wrongAnswer = Math.floor((Math.random() * 100) + 1);
  } while(wrongAnswer == goodAnswer || allAnswers.indexOf(wrongAnswer) !== -1);

  allAnswers.push(wrongAnswer);
}

allAnswers[Math.floor(Math.random() * 4)] = goodAnswer;

我省略了HTML部分,但是你可以在构建数组后轻松完成。

修改

或者如果你真的想在同一个循环中处理HTML,你也可以在循环之前确定好答案的位置,以便每个位置的性质(错误或好)从一开始就是众所周知的。现在,您不必在之后覆盖其中一个错误的答案,并且可以安全地在循环内创建按钮。

var goodAnswer = 21,
    gaPosition = Math.floor(Math.random() * 4),
    allAnswers = [],
    buttonArea = $("#answerOptions"),
    answer, n;

for(n = 0; n < 4; n++) {
  if(n == gaPosition) {
    answer = goodAnswer;
  }
  else {
    do {
      answer = Math.floor((Math.random() * 100) + 1);
    } while(answer == goodAnswer || allAnswers.indexOf(answer) !== -1);        
  }
  allAnswers.push(answer);

  input = $('<div class="col-xs-6"><button class="btn btn-primary answerButton">'+ answer +'</button></div>');
  input.appendTo(buttonArea); 
}