跨多个页面获取随机的,未重复的项目

时间:2018-10-14 14:21:10

标签: javascript random shuffle

我有五个不同的页面。每个按钮都有一个可随机重定向到其他按钮的按钮。

我正在努力做到这一点,以使用户不会进入重复的页面(至少在遍历所有页面之后)。

我可以在同一个页面中添加一个函数来处理随机的,非重复的内容,但是我该如何使该函数在不同页面上工作,并记住已经访问过哪些页面呢?

我试图将该函数保存在一个外部js文件中,并在每个页面的开头部分调用它,但是它不起作用。

我也尝试使用localStorage,但没有结果。

我做错什么了吗?首先有可能吗?

这就是我正在使用的:

localStorage.getItem("currentRemainingPages");

var page1 = "0001.html"
var page2 = "0002.html"
var page3 = "0003.html"
var page4 = "0004.html"
var page5 = "0005.html"

const originalPages = [page1, page2, page3, page4, page5];
let remainingPages = [];

function randomize() {
  if (remainingPages.length === 0) remainingPages = originalPages.slice();
  localStorage.setItem("currentRemainingPages", remainingPages);
  const {
    length
  } = remainingPages;
  const [page] = remainingPages.splice(Math.floor(Math.random() * length), 1);

  window.location.href = page;
}
<h1>Page 0</h1>
<p><button onclick="randomize()" type="button">Random Page</button></p>

1 个答案:

答案 0 :(得分:1)

三个问题:

  • 您仅致电localStorage.getItem("currentRemainingPages");,但对结果不做任何事情。相反,您总是使用空数组初始化let remainingPages
  • 您将需要对数组进行序列化和反序列化,因为localStorage仅存储字符串。您可以简单地通过定界符进行连接和拆分,或者使用JSON或其他一些自定义编码。
  • 您先致电localStorage.setItem("currentRemainingPages", remainingPages);,然后从remainingPages中选择(并删除)随机页面。

代替使用

const originalPages = ["0001.html", "0002.html", "0003.html", "0004.html", "0005.html"]
let remainingPages = (() => {
    try {
        return JSON.parse(localStorage.getItem("currentRemainingPages"));
    } catch(e) {
        return null;
    }
})();
if (!Array.isArray(remainingPages) || remainingPages.length == 0)
    remainingPages = originalPages.slice();

function randomize() {
    const i = Math.floor(Math.random() * remainingPages.length);
    const [page] = remainingPages.splice(i, 1);
    localStorage.setItem("currentRemainingPages", JSON.stringify(remainingPages));
    window.location.href = page;
}