1

このスクリプトを使用して、配列の値を使用して一連の乱数を作成し、これらの数値を div の 2 つのリストに適用します

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と、index は 20 から 39 になります。したがって、リセットする必要があります。

さらに、まだ境界内にあるかどうかを確認したい場合があります。

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

全体を頭の中で回してrandorder(1回)ループする方が簡単で、自然にエラー耐性があります。

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()1 から n ではなく、0 から 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にリセットしないため、20の両方の反復を通じて常に0からカウントアップしているということです。正しい解決策は、2番目の前にインデックスを追加することです。 。各(..);

于 2012-11-30T18:07:43.393 に答える
0

インデックスは質問用で、インクリメント後、回答 $.each のみが未定義になる場合があります。指標値を確認してください。

ありがとう

于 2012-11-30T17:18:24.650 に答える