如何检测脚本是否尝试添加重复ID?日志记录器开发求助
问题:日志记录器无法检测重复ID
我正在开发一款记录用户ID与名称的日志记录器,但无法检测脚本是否尝试添加重复ID。我尝试用id.includes(user._id)判断,但这个if条件始终不触发,相关代码如下:
let id = []; MPP.client.on('participant added', user => { if (id.includes(user._id)) return console.log( `%c - joined, seen ${user._id}, n: ${user.name}`, 'color: red;' ); id.push({ id: user._id, n: user.name, action: 'joined' }); console.log( `%c + joined, added ${user._id} to list, n: ${user.name}`, 'color: lime;' ); }); MPP.client.on('participant removed', user => { if (id.includes(user._id)) return console.log( `%c - left, seen ${user._id}, n: ${user.name}`, 'color: red;' ); id.push({ id: user._id, n: user.name, action: 'left' }); console.log( `%c + left, added ${user._id} to list, n: ${user.name}`, 'color: lime;' ); });
问题根源
你的id数组里存储的是对象(比如{ id: user._id, n: user.name, action: 'joined' }),但includes(user._id)是在数组里查找是否存在等于user._id这个字符串的元素。数组里全是对象,自然永远匹配不到,所以if条件永远不成立,导致重复ID不断被添加。
修复方案
改用Array.some()方法遍历数组,检查是否已有对象的id属性等于当前user._id:
修改后的代码如下:
let id = []; MPP.client.on('participant added', user => { // 检查数组中是否已有对应ID的对象 const hasDuplicate = id.some(item => item.id === user._id); if (hasDuplicate) return console.log( `%c - joined, seen ${user._id}, n: ${user.name}`, 'color: red;' ); id.push({ id: user._id, n: user.name, action: 'joined' }); console.log( `%c + joined, added ${user._id} to list, n: ${user.name}`, 'color: lime;' ); }); MPP.client.on('participant removed', user => { const hasDuplicate = id.some(item => item.id === user._id); if (hasDuplicate) return console.log( `%c - left, seen ${user._id}, n: ${user.name}`, 'color: red;' ); id.push({ id: user._id, n: user.name, action: 'left' }); console.log( `%c + left, added ${user._id} to list, n: ${user.name}`, 'color: lime;' ); });
额外优化建议
如果需要频繁检查重复,用Map存储会比数组遍历效率更高,直接以ID为键存储用户信息:
const userLog = new Map(); MPP.client.on('participant added', user => { if (userLog.has(user._id)) return console.log( `%c - joined, seen ${user._id}, n: ${user.name}`, 'color: red;' ); userLog.set(user._id, { n: user.name, action: 'joined' }); console.log( `%c + joined, added ${user._id} to list, n: ${user.name}`, 'color: lime;' ); }); // participant removed 事件同理修改
内容的提问来源于stack exchange,提问作者partialinvisibility
相关产品推荐
相关产品推荐

