Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 流星分类随机收集_Sorting_Random_Meteor - Fatal编程技术网

Sorting 流星分类随机收集

Sorting 流星分类随机收集,sorting,random,meteor,Sorting,Random,Meteor,我想从流星收藏中随机挑选一组。最好/最有效的方法是什么 我目前使用的是非常整洁的,例如: Template.userList.helpers({ users: function() { return _.shuffle(Meteor.users.find().fetch()); } }); 我使用Jade,所以在模板级别可能有一个选项?您可以使用,如下所示: Template.userList.helpers({ users: function() { retur

我想从流星收藏中随机挑选一组。最好/最有效的方法是什么

我目前使用的是非常整洁的,例如:

Template.userList.helpers({
  users: function() {
    return _.shuffle(Meteor.users.find().fetch());
  }
});
我使用Jade,所以在模板级别可能有一个选项?

您可以使用,如下所示:

Template.userList.helpers({
  users: function() {
    return _.shuffle(Meteor.users.find().fetch());
  }
});
尽管这看起来很滑稽,但在引擎盖下有一个区别:

下划线()

\uuux.shuffle=函数(obj){
var集合=isArrayLike(obj)?obj:uj.值(obj);
变量长度=set.length;
var shuffled=数组(长度);
对于(var索引=0,rand;索引<长度;索引++){
rand=随机(0,索引);
如果(rand!==索引)被洗牌[index]=洗牌[rand];
洗牌[随机]=集合[索引];
}
换位;
};
低破折号(为便于比较而略微修改,)

\uuu0.shuffle=函数(集合){
最大数组长度=4294967295;
返回样本大小(集合,最大数组长度);
}
函数sampleSize(集合,n){
var指数=-1,
结果=到阵列(收集),
长度=结果长度,
lastIndex=长度-1;
n=夹具(toInteger(n),0,长度);
而(++指数
您可以更深入地比较这两个库


下划线和低破折号都使用的是,你很难做到“比”更好。

问题:既然你在模板中使用的是数组而不是光标,那么它是否仍然是被动的?@Kyll,是的,但是如果对集合进行了更新,整个帮助器都将重新计算,因此没有好的细粒度更新,这可能是一个问题,也可能不是。这是我找到的最好的解决办法,我认为没有更好的方法来实现同样的目标。
_.shuffle = function(obj) {
  var set = isArrayLike(obj) ? obj : _.values(obj);
  var length = set.length;
  var shuffled = Array(length);
  for (var index = 0, rand; index < length; index++) {
    rand = _.random(0, index);
    if (rand !== index) shuffled[index] = shuffled[rand];
    shuffled[rand] = set[index];
  }
  return shuffled;
};
_.shuffle = function(collection) {
  MAX_ARRAY_LENGTH = 4294967295;
  return sampleSize(collection, MAX_ARRAY_LENGTH);
}

function sampleSize(collection, n) {
  var index = -1,
      result = toArray(collection),
      length = result.length,
      lastIndex = length - 1;

  n = clamp(toInteger(n), 0, length);
  while (++index < n) {
    var rand = baseRandom(index, lastIndex),
        value = result[rand];

    result[rand] = result[index];
    result[index] = value;
  }
  result.length = n;
  return result;
}