如何在JavaScript对象中过滤获取指定name对应的socketId
问题解决方案
你当前代码的核心问题是普通对象无法直接调用数组的filter方法——rooms['room1']是一个键值对结构的对象,而非数组,所以原代码执行时会直接报错,更无法得到期望结果。要获取目标socketId,需要遍历对象的键值对来匹配条件,以下是两种可行方案:
方案一:用Object.entries遍历键值对
const rooms = { "room1": { "socketId1":{ id: "123", name: "the person name 1" }, "socketId2":{ id: "bq89", name: "the person name 2" } }, "room2": { "socketId11":{ id: "jkl", name: "room 2 name 1" }, "socketId22":{ id: "lpo", name: "room 2 name 2" } } } // 将对象转为键值对数组,找到id匹配项后取对应的键名 const socketId = Object.entries(rooms['room1']).find(([key, user]) => user.id === 'bq89')?.[0]; console.log(socketId); // 输出:socketId2
方案二:用Object.keys遍历键名(兼容旧环境)
如果需要兼容不支持可选链语法的运行环境,可以用循环遍历:
const roomUsers = rooms['room1']; let socketId = ''; // 遍历所有socketId键名,匹配对应id值 for (const key of Object.keys(roomUsers)) { if (roomUsers[key].id === 'bq89') { socketId = key; break; // 找到目标后停止遍历,提升效率 } } console.log(socketId); // 输出:socketId2
关键说明
Object.entries()会把对象转换为[键名, 对应值]格式的数组,这样就能使用数组的find方法匹配条件。- 可选链
?.用于避免找不到匹配项时出现undefined报错,若能确保目标一定存在,可省略该语法。
内容的提问来源于stack exchange,提问作者Jerry Seigle
相关产品推荐
相关产品推荐

