【问题标题】:How can I make it so that once a value in an array is used, it can't be used again until the array is finished?我怎样才能使它一旦使用数组中的值,在数组完成之前不能再次使用它?
【发布时间】:2025-11-30 01:40:01
【问题描述】:

在网站上,我希望在有人单击按钮时显示随机图片。图片的 URL 包含在数组中的 javascript 文件中。到目前为止它工作正常,但是我想让它一旦出现图片,它就不能再次出现,直到数组中的所有其他项目都出现。换句话说,在数组中的所有图片完成之前,我不希望任何图片显示两次。我要在下面的代码中添加什么?

var images = 
["sample1.png", 
"sample2.png", 
"sample3.png", 
"sample4.png", 
"sample5.png", 
"sample6.png", 
"sample7.png"];
var rand = images[Math.round(Math.random() * (images.length - 1))];

function test(){
rand = images[Math.round(Math.random() * (images.length - 1))];
document.getElementById("picture").style.background = "url('/images/"+rand+"') no-repeat center center";
}

【问题讨论】:

  • 随机排列数组,然后遍历它。
  • 创建另一个数组,当计算图像的索引时,将相应数组中的布尔值设置为true。您可以针对每个索引与此数组进行比较。

标签: javascript arrays random


【解决方案1】:

你可以这样使用它,

跟踪还剩下哪些可能性,并在没有新可能性的情况下重置。

在这种情况下我使用了一个字符串数组,但原理是一样的:)

jsfiddle:http://jsfiddle.net/D3XSY/

var messages = ['hello', 'there', 'this', 'is', 'a', 'test'];
var available = [].concat(messages);
var interval;

function update(id) {
    if (available.length === 0) {
        available = [].concat(messages);
    }
    var ri = Math.floor(Math.random() * available.length);
    var msg = available[ri], el = document.getElementById(id);
    if (el) {
        el.innerHTML = msg;
    }
    available.splice(ri, 1);
}

interval = setInterval(update.bind(null, 'promo'), 500);

【讨论】:

    【解决方案2】:

    你可以做点什么like this fiddle

    基本上保留一个可用图像的运行列表,并在您全部使用它们后将其重置。

    var defaultImages = ["sample1.png", "sample2.png", "sample3.png", "sample4.png", "sample5.png", "sample6.png", "sample7.png"],
        availImages = [],
        randomImage = '',
        button = document.getElementById('testButton');
    
    button.onclick = test;
    
    function test()
    {
        if(availImages.length == 0)
                availImages = defaultImages.slice(0);
    
        randomImage = availImages[Math.floor(Math.random() * availImages.length)];
    
        var index = 0;
        for(indexLength = availImages.length; index < indexLength; index++)
        {
            if(availImages[index] == randomImage)
                break;
        }
    
        availImages.splice(index, 1)
        console.log(randomImage);
    }
    

    【讨论】:

      最近更新 更多