你可以使用Lodash _.shuffle,就像這樣:
Template.userList.helpers({
users: function() {
return _.shuffle(Meteor.users.find().fetch());
}
});
隨着熱鬧的作爲似乎有是引擎蓋下的區別:
下劃線(source)
_.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;
};
Lo-Dash(稍微修改爲便於比較的,source)
_.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;
}
你可以看看this SO discussion進行了較深入瞭解比較這兩個庫。
Underscore和Lo-Dash都使用Fisher-Yates shuffle,你會比「更好」做的更困難。
問題:既然你在你的模板中使用了一個數組而不是一個光標,它仍然是被動的? – 2014-11-21 14:10:04
@Kyll,是的,但是如果對集合進行更新,整個幫助程序將被重新計算,所以沒有很好的細化更新,這可能會也可能不是問題。 – 2014-11-21 15:08:54
這是我找到的最佳解決方案,我認爲沒有更好的方法來實現相同。 – SsouLlesS 2015-07-22 21:15:48