随机选择并使用下划线从集合中删除

时间:2013-04-12 05:28:59

标签: javascript arrays backbone.js collections underscore.js

我收集了 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”重新显示,因为它已被使用

我希望这是有道理的

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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/

答案 2 :(得分:0)

您可以创建一个数组来存储您使用过的值,并检查所有新的随机数以查看它们是否出现。虽然随机数生成器试图猜测一个数字,但这会在数组末尾变得混乱。

如果是我,我会提到您提到的内容,并在使用它们时将这些元素取出并将它们放入临时数组中。使用所有元素后,将temp数组重新分配给原始变量名。