Immutable.js 从immutablejs中的列表中获取随机选择

Immutable.js 从immutablejs中的列表中获取随机选择,immutable.js,Immutable.js,下划线js有一个示例函数,它将“从列表中生成一个随机示例。传递一个数字以从列表中返回n个随机元素。否则将返回一个随机项。” 我有一个不可变的列表,但我看不到从列表中随机获得10个项目的明确方法。如何在immutablejs中实现这一点?基本上就是对一个不可变列表进行修改和重写。有更好的方法可以做到这一点,这主要是一个演示-当有疑问时,使用您想要的函数并重写它以满足您的需要。从那里优化: _immu = {}; _immu.sample = function(list, n) { if (n

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


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

基本上就是对一个不可变列表进行修改和重写。有更好的方法可以做到这一点,这主要是一个演示-当有疑问时,使用您想要的函数并重写它以满足您的需要。从那里优化:

_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));
};
编辑以添加JSBin:

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