JS-Discord Bot:从数组中移除指定ID的技术实现问题
解决Discord Bot中离线成员ID无法从数组移除的问题
你的代码里离线处理部分的问题很明确:Array.filter() 方法不会修改原数组,而是返回一个新数组。你现在只是调用了filter但没有把结果赋值回membersOnline,所以原数组根本没变化。
修复方案1:重新赋值过滤后的数组
把离线分支的代码改成这样,让过滤后的新数组覆盖原变量:
$bot.on("presenceUpdate", (oldMember, newMember) => { if(oldMember.presence.status !== newMember.presence.status){ const memberID = newMember.user.id; if(newMember.user.presence.status === "online"){ membersOnline.push(memberID); console.log("-------online--------"); console.log(membersOnline); }else if(newMember.user.presence.status === "offline"){ // 关键:将过滤后的结果赋值回原数组变量 membersOnline = membersOnline.filter(e => e !== memberID); console.log("-------offline--------"); console.log(membersOnline); // 现在能看到ID已被移除 } } });
修复方案2:使用splice直接修改原数组
如果你更倾向于直接操作原数组(避免创建新数组),可以先找到目标ID的索引再删除:
else if(newMember.user.presence.status === "offline"){ const index = membersOnline.indexOf(memberID); if(index !== -1){ // 先确认ID存在于数组中,避免报错 membersOnline.splice(index, 1); } console.log("-------offline--------"); console.log(membersOnline); }
进阶优化:用Set替代数组管理在线成员
如果你的Bot成员数量较多,推荐用Set来存储在线ID——它的add和delete操作效率更高,还能自动避免重复添加同一个ID(比如成员多次切换在线状态时):
// 初始化时用Set替代数组 const membersOnline = new Set(); $bot.on("presenceUpdate", (oldMember, newMember) => { if(oldMember.presence.status !== newMember.presence.status){ const memberID = newMember.user.id; if(newMember.user.presence.status === "online"){ membersOnline.add(memberID); console.log("-------online--------"); console.log([...membersOnline]); // 转成数组格式打印 }else if(newMember.user.presence.status === "offline"){ membersOnline.delete(memberID); console.log("-------offline--------"); console.log([...membersOnline]); } } });
内容的提问来源于stack exchange,提问作者vakacjus
相关产品推荐
相关产品推荐

