【问题标题】:Get random selection from list in immutablejs从immutablejs中的列表中获取随机选择
【发布时间】:2016-02-01 15:34:15
【问题描述】:

Underscore js 有一个示例函数,它将“从列表中生成一个随机样本。传递一个数字以从列表中返回 n 个随机元素。否则将返回一个随机项。”

我有一个不可变的列表,但我看不到从列表中随机获取 10 个项目的明确方法。这在 immutablejs 中如何实现?

【问题讨论】:

    标签: immutable.js


    【解决方案1】:

    几乎只是采用annotated source from underscore.js for sample - 并重写一个不可变列表。有更好的方法可以做到这一点,这主要只是一个演示——当有疑问时,取你想要的函数并重写它以满足你的需要。从那里优化:

    _immu = {};
    _immu.sample = function(list, n) {
      if (n === undefined) return list.get(_immu.random(list.size - 1));
      return _immu.shuffle(list).slice(0, Math.max(0, n));
    };
    
    _immu.shuffle = function(list) {
      var set = list;
      var size = set.size;
      var shuffled = Immutable.List(Array(size));
      for (var index = 0, rand; index < size; index++) {
        rand = _immu.random(0, index);
        if (rand !== index) shuffled = shuffled.set(index, shuffled.get(rand));
        shuffled = shuffled.set(rand, set.get(index));
      }
      return shuffled;
    };
    
    _immu.random = function(min, max) {
      if (max == null) {
        max = min;
        min = 0;
      }
      return min + Math.floor(Math.random() * (max - min + 1));
    };
    

    工作方式与示例相同,因此可以通过以下方式调用:

    var list = Immutable.List([1,2,3,4,5])
    _immu.sample(list, 3).toJS() //toJS here is just to show it as an array
    

    编辑添加 JSBin:https://jsbin.com/levigemina/edit?js,console,output

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-19
      • 2012-04-30
      • 2021-12-15
      • 1970-01-01
      相关资源
      最近更新 更多