JavaScript中如何过滤数组得到玩家参与过的房间名称列表
实现方案
首先建议你先把房间数组转换成 ID 到名称的映射表,避免每次查询房间名都要遍历数组,优化查找效率,再结合 ES6 的 filter、map 方法就能轻松得到目标结构:
// 第一步:生成房间ID对应名称的映射 const roomIdToName = new Map(rooms.map(room => [room.id, room.name])); // 第二步:生成所有玩家的参与房间列表 const playerRooms = players.map(player => { // 筛选当前玩家的所有房间连接记录 const myRooms = connectedRooms .filter(item => item.playerId === player.id) // 把房间ID替换为房间名称 .map(item => roomIdToName.get(item.roomId)); return { key: player.nickname, value: myRooms } }); // 如果只需要 BIG BOSS 对应的结果,单独筛选即可 const target = playerRooms.find(item => item.key === 'BIG BOSS'); console.log(target); // 输出:{ key: 'BIG BOSS', value: [ 'CHICKEN WINNER', 'BURGER TIME' ] }
逻辑说明
- 用
Map做映射是典型的空间换时间操作,数据量越大相比嵌套遍历的性能优势越明显 - 你之前的代码只拿到了房间ID,核心是少了「ID转房间名」的步骤,上面的方案通过映射表直接匹配就可以解决
- 如果后续需要增加筛选条件(比如只保留游玩时长超过30秒的房间),直接在
filter方法里加判断条件即可,拓展性更强。
内容的提问来源于stack exchange,提问作者Gamoxion
相关产品推荐
相关产品推荐

