Socket.io私有聊天应用中互换ID组合的房间索引查找
解决Socket.io房间双向ID组合的索引查找问题
嘿,我明白你的需求了——你现在需要在Socket.io的房间列表里,找到两个用户ID任意顺序拼接的房间索引,原来的indexOf只能匹配固定顺序,确实不够灵活。下面给你两种简单的解决方案,直接就能替换你现有的代码:
方法1:用findIndex自定义匹配逻辑
findIndex可以让你自定义判断条件,完美适配需要匹配两种组合的场景:
// 替换你原来的indexOf代码 const indexPosition = Object.keys(this.adapter.rooms).findIndex(roomId => { // 检查当前房间ID是否是两种拼接顺序中的任意一种 return roomId === socket.id + selectedUser || roomId === selectedUser + socket.id; });
这个方法的好处是直接明了,遍历房间列表时,只要遇到符合两种组合之一的房间ID,就会返回它的索引;如果没找到,会返回-1,和indexOf的返回逻辑完全一致,你可以无缝替换原来的代码。
方法2:预生成目标房间数组再匹配
如果你觉得逻辑拆分更清晰,可以先把两种可能的房间ID存到数组里,再用includes判断:
// 生成两种可能的目标房间ID const targetRoomIds = [ socket.id + selectedUser, selectedUser + socket.id ]; // 查找匹配的索引 const indexPosition = Object.keys(this.adapter.rooms).findIndex(roomId => targetRoomIds.includes(roomId));
这种方式在后续需要调整组合规则时(比如以后加分隔符),维护起来更方便,只需要修改targetRoomIds数组即可。
额外提示:如果只需要判断房间是否存在
如果你不需要索引,只是想确认这个双向组合的房间是否存在,可以用some方法,性能会稍微好一点(找到匹配项就停止遍历):
const hasTargetRoom = Object.keys(this.adapter.rooms).some(roomId => { return roomId === socket.id + selectedUser || roomId === selectedUser + socket.id; });
结合你给出的示例:用户1ID是5eac61e5e481853528f4ef11,用户2是5eac61fde481853528f4ef13,不管房间ID是前者加后者还是后者加前者,上面的代码都能准确找到对应的索引或者判断存在性。
内容的提问来源于stack exchange,提问作者Deeyu




