如何修改JS随机选数组元素代码以避免重复输出?
实现无重复随机跳转直至数组耗尽的方案
嘿,这个需求很容易解决!核心思路是维护一个剩余未跳转的链接数组,每次选中后就把该元素从剩余数组中移除,直到剩余数组为空时再重置回原数组。这样就能保证每次点击都是全新的站点,不会重复,直到所有链接都用完才会重新循环。
下面是修改后的完整代码:
<script> // 原链接数组 var links = [ "page-1", "page-2", "page-3", // ... "page-108", ]; // 维护剩余未跳转的链接数组,初始化时复制原数组 var remainingLinks = [...links]; function openSite() { // 如果剩余数组为空,重置回原数组的副本 if (remainingLinks.length === 0) { remainingLinks = [...links]; console.log("所有链接已遍历完毕,重新开始循环"); } // 从剩余数组中随机选取索引 var randIdx = Math.floor(Math.random() * remainingLinks.length); // 取出选中的链接 var selectedPage = remainingLinks[randIdx]; // 从剩余数组中移除已选中的元素 remainingLinks.splice(randIdx, 1); // 构造完整链接并跳转 var link = 'https://websitename.com/page/' + selectedPage; window.location.assign(link); }; </script>
关键改动解释:
- 新增
remainingLinks变量:用来存储还没被跳转的链接,初始时用扩展运算符[...links]复制原数组(避免直接修改原数组)。 - 空数组检查:每次点击时先判断剩余数组是否为空,如果为空就重置为原数组的副本,实现循环复用。
- 删除已选元素:用
splice(randIdx, 1)从剩余数组中移除刚选中的链接,确保下次不会再选到它。 - 优化随机索引生成:把原来的
parseInt(Math.random() * length)改成更简洁的Math.floor(Math.random() * length),效果一致但可读性更好。
这样修改后,每次点击按钮都会跳转到之前没去过的站点,直到108个页面都遍历完,才会重新开始新一轮的无重复随机跳转~
内容的提问来源于stack exchange,提问作者Meghan K
相关产品推荐
相关产品推荐

