【问题标题】:Pick random and remove from collection using underscore使用下划线随机选择并从集合中删除
【发布时间】:2013-04-12 05:28:58
【问题描述】:

我收集了 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" 再次出现,因为它已被使用过

我希望这是有道理的

【问题讨论】:

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


    【解决方案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)
    

    【讨论】:

      【解决方案2】:
      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/

      【讨论】:

        【解决方案3】:

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

        如果是我,我会按照您的暗示进行操作,并在使用时取出元素并将它们放入临时数组中。使用所有元素后,将临时数组重新分配给原始变量名称。

        【讨论】:

        • 提及您的问题的标签有助于获得更多答案。
        猜你喜欢
        • 2013-03-28
        • 1970-01-01
        • 1970-01-01
        • 2019-11-25
        • 2011-04-26
        • 1970-01-01
        • 1970-01-01
        • 2022-09-30
        • 1970-01-01
        相关资源
        最近更新 更多