JavaScript世界杯模拟器:如何高效检查避免重复添加球队?
解决随机选取不重复球队的简便方案
嘿,作为经常折腾小型JS游戏的开发者,太懂你这种不想写一堆重复if判断的痛苦了!给你两个超简便的方案,完全不用手动检查重复:
方案1:利用Set自动去重特性
Set是JS里专门存储唯一值的数据结构,它会自动忽略重复的添加操作,完美适配你的需求:
// 先准备好所有非卡塔尔的球队数组 const allNonQatarTeams = ["巴西", "德国", "阿根廷", "法国", /* ... 剩下的球队 */]; const selectedTeams = new Set(); // 循环添加直到选够31支 while (selectedTeams.size < 31) { // 随机生成数组索引 const randomIdx = Math.floor(Math.random() * allNonQatarTeams.length); selectedTeams.add(allNonQatarTeams[randomIdx]); } // 把Set转成数组方便后续处理 const finalTeamList = Array.from(selectedTeams);
这个方法的好处是代码极简,不用写任何判断重复的逻辑——Set帮你搞定了一切。不过如果你的球队总数刚好比31多一点,可能会多循环几次,但对于世界杯球队数量来说完全没问题。
方案2:Fisher-Yates洗牌后取前31支(更高效)
如果想避免“碰运气”式的循环,推荐用洗牌算法先把球队数组打乱,直接取前31个就行,从根源上杜绝重复:
const allNonQatarTeams = ["巴西", "德国", "阿根廷", "法国", /* ... 剩下的球队 */]; // 实现Fisher-Yates洗牌算法(业界标准的高效洗牌方式) function shuffleTeams(array) { // 先复制原数组,避免修改原始数据 const shuffled = [...array]; for (let i = shuffled.length - 1; i > 0; i--) { const randomPos = Math.floor(Math.random() * (i + 1)); // 交换当前元素和随机位置的元素 [shuffled[i], shuffled[randomPos]] = [shuffled[randomPos], shuffled[i]]; } return shuffled; } // 洗牌后直接取前31支 const shuffledTeamList = shuffleTeams(allNonQatarTeams); const finalTeamList = shuffledTeamList.slice(0, 31);
这个方法效率更高,因为只需要遍历一次数组完成洗牌,然后直接截取结果,完全没有重复的可能,非常适合你的场景。
额外小提示
如果你的原始球队数组里不小心混入了重复项(虽然应该不会),可以先用Set给原数组去重:
const uniqueTeams = [...new Set(allNonQatarTeams)];
再用上面的方法处理就好啦!
内容的提问来源于stack exchange,提问作者Hyyped
相关产品推荐
相关产品推荐

