如何从数组中单击获取随机字符串而不重复?

时间:2014-10-28 18:28:11

标签: javascript jquery arrays

构思是:点击按钮,用数组的唯一字符串替换标题。这个问题是我之前使用了一个数组的字符串:

headlines = new Array("Good", "Bad", "Ugly", "Random Headline");
var randomNumberBefore = 4;
alert (headlines[randomNumberBefore]);

但我不想再次显示相同的标题,这是为什么密钥检查实际索引randomNumberBefore 与新索引randomNumber不一样。以下功能对我有意义,但有时会返回相同的数字,导致标题被自身替换,用户注意到没有变化。

function randomNumberByRange (range, number) {
    var r;
    do {
        var r = Math.floor(Math.random() * range);
    } while (r == number);
    return r;
}

$(document).on('click','.nextquote' , function() {
    var randomNumber = randomNumberByRange( headlines.length, randomNumberBefore);
    var nextHeadline = headlines[randomNumber];

    $(".bannertext").text(nextHeadline);
    console.log(nextHeadline);

});

每次点击都有独特标题的想法吗?

这是我的starting fiddle

-

这是final fiddle

2 个答案:

答案 0 :(得分:2)

您忘记将旧值分配给randomNumberBefore; 之后

var randomNumber = randomNumberByRange( headlines.length, randomNumberBefore);

randomNumberBefore = randomNumber;

PS:有一种方法可以使randomNumberByRange函数更高效:

function randomNumberByRange (range, number) {
    var r = Math.floor(Math.random() * (range-1));
    if(r >= number)r++;
    return r;
}

但是,如果您有很多标题,那么您的功能就足够了(因为碰撞概率随着您在列表中的项目数量而下降)

答案 1 :(得分:1)

如果您不想重复,只需从数组中删除已使用的元素。

var h = new Array("Good", "Bad", "Ugly", "Random Headline");
while (h.length > 0) {
    var i = Math.floor(Math.random() * h.length);
    var t = h.splice(i, 1);
    console.log(t);
}