2014-11-21 128 views
4

我想從流星集合中獲得一個隨機排序的集合。什麼是最好的/最有效的方法?流星排序集合隨機

Mongo options are controversial

我目前使用underscore _.shuffle這是相當整齊,如:

Template.userList.helpers({ 
    users: function() { 
    return _.shuffle(Meteor.users.find().fetch()); 
    } 
}); 

我用玉,所以也許有在模板級別的選項?

+0

問題:既然你在你的模板中使用了一個數組而不是一個光標,它仍然是被動的? – 2014-11-21 14:10:04

+0

@Kyll,是的,但是如果對集合進行更新,整個幫助程序將被重新計算,所以沒有很好的細化更新,這可能會也可能不是問題。 – 2014-11-21 15:08:54

+0

這是我找到的最佳解決方案,我認爲沒有更好的方法來實現相同。 – SsouLlesS 2015-07-22 21:15:48

回答

0

你可以使用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,你會比「更好」做的更困難。