javascript中的持久数组

时间:2014-06-17 22:18:39

标签: javascript arrays

var links = ["http://www.google.com/", "http://www.cnn.com/", "http://www.bbc.com/", "http://www.nbc.com/"];
var random = Math.round(Math.random() * 4);
var previous = [];
previous.push(random);

for (var i = 0; i < previous.length; i++) {
    while (previous[i] == random) {
        random = Math.round(Math.random() * 4);
    }
}
window.location = links[random];

所以我这里有代码。它的目的是,一旦使用谷歌网站上的按钮启动,随机引导用户到其中一个设置站点。我需要它是记住它采取的网站(通过记住Math.random输出)。现在,每次运行代码(模拟用户多次点击按钮),它都会擦除我的内存数组'previous'。我希望此代码为其输出的站点打开一个单独的窗口。无论是使用cookies,iframe还是其他方法,如果有人能帮助我,我将非常感激。

我目前正在阅读关于Javascript的Codecademy课程,所以请理解我是否遗漏了一些简单的内容:)

2 个答案:

答案 0 :(得分:2)

你需要一个全球性的。

使用

var links = ["http://www.google.com/", "http://www.cnn.com/", "http://www.bbc.com/", "http://www.nbc.com/"];
var random = Math.round(Math.random() * 4);
window.previous = window.previous || [];
window.previous.push(random);

for (var i = 0; i < window.previous.length; i++) {
    while (window.previous[i] == random) {
        random = Math.round(Math.random() * 4);
    }
}
window.location = links[random];

答案 1 :(得分:0)

您的解决方案存在一些问题:

  1. 当您导航到其他页面(使用window.location = ...)时,您将丢失所有变量。如果您导航到新页面,即使将其附加到窗口,也无法保留以前的阵列。
  2. for while循环while并没有按照您的想法行事。它应该确保你得到一个尚未使用的数字,但是有一个错误:内部for可以选择一个随机数字,在你走了之后就在前一个数组中进入previous = [0,2]。即如果for,当previous[1] == random循环检查0时,它可以选择previous[0]作为新的随机数,即使它是contains的值{1}}。
  3. 如果您访问了所有链接,那么您将会进行infy-loopy。
  4. 要解决此问题,首先必须在新窗口中开始打开页面。有关如何执行此操作的详细信息,请参阅this SO answer

    其次,您需要更好地确保先前的数组不包含该值。 function contains(array, value) { for (var i = 0; i < array.length; i++) { if (array[i] == value) return true; } return false; } 函数的简单实现是:

    var links = ["http://www.google.com/", "http://www.cnn.com/", "http://www.bbc.com/", "http://www.nbc.com/"];
    var visited = [];
    
    // Assumes you have an element like <button id='btn'>Click me</button>
    var button = document.getElementById('btn');
    button.addEventListener('click', function() {
    
        // If we've visited all the links, don't try redirecting again
        if (visited.length == links.length) {
            alert('You visited all the links');
            return;
        }
    
        // Variables to hold our random number and link
        var random, url;
    
        // Keep getting a new random url while it's one we've already visited
        do {
            random  = Math.round(Math.random() * 3);
            url = links[random];        
        } while (contains(visited, url));
    
        // We have a url we haven't visited yet; add it to the visited array
        visited.push(url);   
    
        // Open the link in a new window so we can hold on to the visited array in this window
        var win = window.open(url, '_blank');
        win.focus();
    });
    
    // A simple function to check if an array contains a value
    function contains(array, value) {
        for (var i = 0; i < array.length; i++) {
            if (array[i] == value) return true;
        }
        return false;
    }
    

    以下是您正在寻找的工作JS小提琴:http://jsfiddle.net/pnP4D/7/

    我保留一个访问过的数组来存储您访问过的链接;你可以像以前的数组一样容易地保存它并存储随机数。

    {{1}}