You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 20:46:12