我目前正在使用javascript进行一些实验,虽然我不是JS的新手但我怀疑我希望SO的好人能够提供帮助。
基本上我正在向一个webservice发出一个jsonp请求,该请求返回回复的数量/长度(只计算对象)。 然后我随机选择其中9个对象放在一个数组中,这就是问题所在。我想确保这9个对象都不会重复。 为实现这一点,我使用以下代码:
function randomizer() {
return Math.ceil(Math.random()*badges.length);
}
function dupsVerify(array, number) {
array.forEach(function () {
if(array === number) {
return true;
}
});
return false;
}
// Randomly choose 9 array indexes
var randomBadge = function () {
var selectedIndexes = new Array();
while(selectedIndexes.length < 9) {
var found = false;
var randomNumber = randomizer();
if(!dupsVerify(selectedIndexes, randomNumber)) {
selectedIndexes.push(randomNumber);
} else {
newRandom = randomizer();
dupsVerify(selectedIndexes, newRandom);
}
}
return selectedIndexes;
}
我尝试了几种不同的方法来进行此验证,但我一直在考虑是否无法执行以下操作:
生成随机数并遍历数组以验证它是否已存在于数组中。如果存在,则生成另一个随机数(randomize call)并再次验证..如果数组中不存在,则将其推送到“final”数组。
我怎样才能做到这一点?使用回调? 我这样做是对吗还是我应该机会代码?有没有更简单的方法呢?
最诚挚的问候,
答案 0 :(得分:3)
这会让你得到理想的行为:
function getRandomPositions(sourcearray, desiredcount){
var result = [];
while(result.lentgth < desiredcount){
var rnd = Math.ceil(Math.random()*sourcearray.length);
if (result.indexOf(rnd) == -1){
result.push(rnd);
}
}
return result;
}
不是生成X个随机数,而是生成一个随机数,但如果它已经存在则不要添加它。
答案 1 :(得分:0)
我最终使用以下代码找到了此方案的最佳解决方案:
function randomizer() {
return Math.ceil(Math.random()*badges.length);
}
function dupsVerify(array, number) {
var result;
if(array.length === 0) {result = false;}
array.forEach(function (item) {
if(item === number) {
result = true;
} else {
result = false;
}
});
return result;
}
// Randomly choose 9 array indexes
function randomBadge() {
while(cards.length < 9) {
var randomNumber = randomizer();
if(!dupsVerify(cards, randomNumber)) {
cards.push(randomNumber);
} else {
randomBadge();
}
}
return cards;
}
这表示相同的行为(以及一些次要的代码更正),但确保我永远不会得到包含2个重复对象的数组。