1

我使用这个脚本来创建一个随机数序列,使用数组的值,并将这些数字应用到两个 div 列表中

var shuffle = function(v) {
    for (var j, x, i = v.length; i; j = parseInt(Math.random() * i), x = v[--i], v[i] = v[j], v[j] = x);
    return v;
};

var randorder = shuffle([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]);
var index = 0;

$('.Questions').each(function() {
    $(this).addClass('question' + (randorder[index++]));
});

$('.answers').each(function() {
    $(this).addClass('answer' + (randorder[index++]));
});

问题是脚本正在返回类答案结果“answerundefined”。

请记住,两组必须具有相同的顺序,以匹配问题和答案。

谢谢

4

4 回答 4

3

很难说,因为我不知道你有多少.Questions.answers但是当你看到 时undefined,这意味着你超出了randorder数组的范围。因此,您至少需要在循环之间将 index 设置回零:

var index = 0;

$('.Questions').each(function() {
    $(this).addClass('question' + (randorder[index++]));
});
index = 0;
$('.answers').each(function() {
    $(this).addClass('answer' + (randorder[index++]));
});

您需要将 index 设置回 0 的原因是,当您完成循环时.Questions, index 的值为 20。因此,当您循环时.answers,索引已从 20 变为 39。您想要 0-19,所以你需要重置它。

此外,您可能想检查您是否仍在界限内:

var randcount = randorder.length;
$('.Questions').each(function() {
    if (randcount > index) {
        $(this).addClass('question' + (randorder[index++]));
    }
});
于 2012-11-30T17:16:12.207 回答
1

将整个事情从头开始并循环通过randorder(一次)会更容易并且自然地容错。

var randorder = shuffle([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]);
var $questions = $('.Questions');
var $answers = $('.answers');

$.each(randorder, function(i, r) {
    $questions.eq(i).addClass('question' + r);
    $answers.eq(i).addClass('answer' + r);
});

当然,您仍然需要确保原始[1, ... 20]数组是正确的长度来打乱所有问题,因此最好根据问题/答案集合的长度自动生成数组。

您可以使用 的修改版本来做到这一点shuffle(),其中整数序列在被洗牌之前生成(毫无疑问存在更好的算法)。

var shuffle = function(n) {
    var v = [];
    for(var i=0; i<n; i++) {
        v.push(i);
    }
    for (var j, x, i = v.length; i; j = parseInt(Math.random() * i), x = v[--i], v[i] = v[j], v[j] = x);
    return v;
};

var $questions = $('.Questions'),
    $answers = $('.answers'),
    randorder = shuffle(Math.min($questions.length, $answers.length));//in case questions and answers are different lengths we choose the lower length.

$.each(randorder, function(i, r) {
    $questions.eq(i).addClass('question' + r);
    $answers.eq(i).addClass('answer' + r);
});

注意:shuffle()返回一个从 0 到 n 的打乱的整数数组,而不是 1 到 n,这可能是原始问题的原因。

于 2012-11-30T17:37:43.587 回答
0
var index = 0;

// Runs 20 times, index starts at = 0
$('.Questions').each(function() {
    $(this).addClass('question' + (randorder[index++]));
});

// Run 20 times, index starts at 20
// index = 0 << You need this.
$('.answers').each(function() {
    // randorder[index++] << index = 20, doesn't exist in your array, hence undefined
    $(this).addClass('answer' + (randorder[index++]));
});

我试图展示的是您使用的是相同的索引,但从未将其重置为 0,因此您不断地从 0 计数到 20 的迭代。正确的解决方案是在第二个之前添加 index = 0 。每个(..);

于 2012-11-30T18:07:43.393 回答
0

索引用于问题,增量后您可能会得到未定义的答案 $.each。检查索引值。

谢谢

于 2012-11-30T17:18:24.650 回答