0

我目前正在使用 javascript 做一些实验,虽然我对 JS 并不陌生,但我怀疑我希望 SO 的好人能够提供帮助。

基本上我正在向一个 web 服务发出一个 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;
}

我尝试了几种不同的方法来进行此验证,但我一直在考虑是否无法执行以下操作:

生成随机数并遍历数组以验证它是否已经存在于数组中。如果存在,则生成另一个随机数(随机调用)并再次验证。如果它不存在于数组中,则将其推送到“最终”数组。

我怎样才能做到这一点?使用回调?我这样做是对的还是应该碰运气的代码?有没有更简单的方法来做到这一点?

最好的祝福,

4

2 回答 2

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 个随机数,不如生成一个随机数,但如果它已经存在,则不要添加它。

于 2013-05-13T14:19:01.533 回答
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 个重复对象的数组。

于 2013-05-14T09:07:44.937 回答