【问题标题】:Loop returning very long array even though it is looping 3 times?循环返回很长的数组,即使它循环了 3 次?
【发布时间】:2016-07-02 10:11:16
【问题描述】:

下面我创建了两个循环。

基本上,它首先遍历包含 4 个值的随机数数组。然后随机生成一个介于 0 和 3 之间的数字,并从随机数数组中选择一个值以随机顺序返回到 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);

【问题讨论】:

  • 不需要很长时间,不到5ms -> jsfiddle.net/zsyuxph7
  • 如果你删除代码中间的console.log(),它需要不到2ms -> jsfiddle.net/zsyuxph7/1
  • 我确实看到了该循环返回未定义值的情况? :)
  • 这是另一个问题,虽然我认为这可能是因为randomizer.splice() 返回未定义。也尝试在使用它们之前定义你的变量
  • 好吧,我并不关心创建阵列需要多长时间。我在问为什么它在实际循环的 4 次中返回一个包含 13 个值的数组。因为我一直想弄清楚为什么数组这么大。

标签: javascript html arrays random


【解决方案1】:

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

另一个问题是如果 'wrongAnswers' 没有通过 indexOf() 条件,就没有'try again'。在这种情况下,不会在该迭代中插入任何内容。

我会推荐一种更简单的方法:构建一个包含 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); 
}

【讨论】:

  • 好的,我知道你要处理这个了。但是你如何告诉它从 allAnswers 数组中循环一个随机数组位置呢? (我添加了一个编辑以显示您创建的更新循环。)
  • 我不确定通过从 allAnwsers 数组中循环随机数组位置来理解您的意思。我的原始代码中是否缺少一部分?
  • 另外,如果您想更新主循环中的 HTML,请查看我的更新答案。您原始帖子中的更新不会按预期工作,因为它没有考虑“好答案更新”。 (我的第一个提议是注入好答案之后在另一个循环中处理 HTML。)
  • 所以基本上需要发生的是一个答案 goodAnswer = 21 将是预先确定的。然后需要发生的是我需要生成 3 个错误答案,然后将它们推入 goodAnswer 所在的数组中。一旦发生这种情况,必须发生一个循环,它会生成一个介于 0-3 之间的数字。这个数字将用于在按钮生成中循环 allAnswers[randomNumber]。该随机数必须是唯一的,不能有两次相同的按钮。
  • 但话又说回来,它本身似乎是随机的。有没有一种方法可以让我控制或始终知道正确答案是数组中的哪个数字?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 2019-05-05
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 2021-01-26
相关资源
最近更新 更多