3

20 個の結果 (オブジェクト)のコレクションがあり、ボタンがクリックされたときにやりたいことは次のとおりです。

a)このコレクション/配列からランダムなオブジェクトを選択します

b) ボタンが再び押されたとき - コレクションが使い果たされるまで (つまり、20 個のアイテムが表示されるまで)、そのオブジェクトを再選択したくありません。

そのコレクションのインデックスをつなぎ合わせることだけを考えましたが、Underscore.js を使用したよりクリーンな方法を望んでいます。

例:

var data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11...]

var getRand = _.random(0, data.length);

==> 3

次回ボタンを押したときに、結果「3」が使用されているため、再表示したくありません

これが理にかなっていることを願っています

4

3 に答える 3

1
var data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];

// cache indexes
var cache = _.map(new Array(data.length + 1).join(), function (item, index) {
  return index;
});

// get random from cached array
var rand = _.random(0, cache.length);

// remove random index from cache
cache.splice(rand, 1);

console.log(rand, cache)
于 2013-04-12T06:58:48.700 に答える
1
var data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
var picked = [];

$("#link").click(function() {
   if(data.length == 0) return;
   var pick = data.splice(_.random(0,data.length),1);
   picked.push(pick);
   $("#pick").html(pick);
   $("#data").html(data.join(","));
   $("#picked").html(picked.join(","));
});

http://jsfiddle.net/Z3vjk/

于 2013-04-12T11:38:17.467 に答える
0

使用した値を格納する配列を作成し、すべての新しい乱数をチェックして、それらが表示されるかどうかを確認できます。ただし、乱数ジェネレーターが単一の数値を推測しようとするため、これは配列の終わり近くで乱雑になります。

それが私だったら、あなたがほのめかしたことだけで、使用する要素を取り出して一時的な配列に配置します。すべての要素が使用されたら、一時配列を元の変数名に再割り当てします。

于 2013-04-12T05:51:46.247 に答える