用set管理已中奖名单最自然高效:天生去重、o(1)增删查,推荐用用户id作元素;支持导出数组、localstorage持久化及clear清空;进阶可用limitedwinnerset限制人数并自动淘汰最早记录。

用 Set 管理已中奖名单是最自然、高效的方式——它天生去重、增删快、语义清晰,比数组 + includes 或对象键模拟更简洁可靠。
初始化一个 Set 存储中奖用户 ID
推荐用唯一标识(如用户 ID 字符串或数字)作为元素,避免用对象引用(容易误判重复):
const winners = new Set();<br>// 示例:添加中奖者<br>winners.add('user_1001');<br>winners.add(2002);<br>winners.add('user_1001'); // 重复添加自动忽略,size 仍为 2
抽奖时快速判断是否已中奖
每次生成新中奖 ID 后,用 has() 检查,时间复杂度 O(1),比数组遍历快得多:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
function drawWinner(candidateId) {<br> if (winners.has(candidateId)) {<br> console.log('该用户已中奖,跳过');<br> return null;<br> }<br> winners.add(candidateId);<br> return candidateId;<br>}<br><br>// 使用示例<br>drawWinner('user_1001'); // ✅ 第一次添加<br>drawWinner('user_1001'); // ❌ 返回 null,不重复中奖
支持导出、清空与持久化同步
Set 可轻松转为数组或 JSON 字符串,方便存 localStorage 或上报服务端:
-
导出为数组:
[...winners]或Array.from(winners) -
保存到 localStorage:
localStorage.setItem('winners', JSON.stringify([...winners])) -
初始化时恢复:
const saved = JSON.parse(localStorage.getItem('winners') || '[]'); const winners = new Set(saved); -
清空名单:
winners.clear()(比重新赋值更语义明确)
进阶:限制中奖人数并自动淘汰最早记录
若需实现“仅保留最近 100 位中奖者”,可用 Set 配合队列逻辑(借助数组暂存顺序):
class LimitedWinnerSet {<br> constructor(maxSize = 100) {<br> this.set = new Set();<br> this.queue = []; // 记录插入顺序<br> this.maxSize = maxSize;<br> }<br><br> add(id) {<br> if (this.set.has(id)) return false;<br> this.set.add(id);<br> this.queue.push(id);<br> if (this.queue.length > this.maxSize) {<br> const oldest = this.queue.shift();<br> this.set.delete(oldest);<br> }<br> return true;<br> }<br>}<br><br>const winners = new LimitedWinnerSet(3);<br>winners.add('a'); winners.add('b'); winners.add('c'); // size=3<br>winners.add('d'); // 自动移除 'a',set 变为 {'b','c','d'}










