我试图找到一种方法从随机方式的数组中获取值而不重复它们,我找到了以下解决方案:
var letters = ["A", "B", "C"];
var getRandom = (function(array) {
var notGivenItems = array.map(function(el) {
return el;
});
var getIndex = function() {
return Math.floor(Math.random() * notGivenItems.length);
};
return function() {
if (notGivenItems.length === 0) {
return;
}
return notGivenItems.splice(getIndex(), 1)[0];
};
})(letters);
console.log(getRandom());
console.log(getRandom());
console.log(getRandom());
console.log(getRandom());
如果我打印console.log()
4次,最后,数组显示为undefined
,这正是我需要的。但是,我需要(function () {...
不要自动触发,因为来自AJAX
的值。所以,应该是这样的:
function selec() {
var getRandom = (function(array) {
var notGivenItems = array.map(function(el) {
return el;
});
var getIndex = function() {
return Math.floor(Math.random() * notGivenItems.length);
};
return function() {
if (notGivenItems.length === 0) {
return;
}
return notGivenItems.splice(getIndex(), 1)[0];
};
})(letters);
return getRandom();
}
console.log(selec());
然后,该函数继续连续打印值,而不返回undefined
。
答案 0 :(得分:0)
每当您致电selec()
时,它都会重新创建getRandom
功能。
您需要做的是在getRandom
函数范围之外定义selec()
。
您可以在同一级别执行此操作:
var getRandom = (function(array) { ... })(letters);
var selec = function() { return getRandom; };
或您可以创建一个闭包来保护getRandom
不受命名冲突的影响:
var selec = (function() {
var getRandom = (function(array) { ... })(letters);
return function() { return getRandom; };
})();
答案 1 :(得分:0)
我希望我理解你的问题..如果是的话,真的很容易。选中 fiddle
var letters = ["A", "B", "C"];
function getRandom(array){
var notGivenItems = array.map(function(el){
return el;
});
var getIndex=function(){
return Math.floor(Math.random() * notGivenItems.length)
};
if (notGivenItems.length === 0)
return;
return array.splice(getIndex(), 1)[0];
}
console.log(getRandom(letters));
console.log(getRandom(letters));
console.log(getRandom(letters));
console.log(getRandom(letters));