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