You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动