2016-02-01 1 views
0

Underscore js a un exemple de fonction qui va "Produire un échantillon aléatoire de la liste.Passer un nombre pour retourner n éléments aléatoires de la liste.Sinon un seul élément aléatoire sera retourné."Obtenir une sélection aléatoire de la liste dans immutablejs

J'ai une liste immuable mais je ne vois pas de façon claire d'obtenir 10 éléments aléatoires de la liste. Comment cela peut-il être accompli dans les immutables?

Répondre

0

Presque tout simplement prendre le annotated source from underscore.js for sample - et réécrire pour une liste Immutable. Il existe de meilleurs moyens de le faire, il s'agit principalement d'une démonstration de - en cas de doute, prenez la fonction que vous voulez et réécrivez-la en fonction de vos besoins. Optimisez à partir de là:

_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)); 
}; 

fonctionne de la même manière que l'échantillon peut donc être invoqué par:

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

Edité ajouter JSBin: https://jsbin.com/levigemina/edit?js,console,output