检查是否存在具有未知键的Javascript嵌套obj值



以下用于构建对象数组:

var users = {};
var user = {};
user[socket.id] = data.username;
if(users[data.roomname]){
   // Room already exists - check user already exists 
   // if data.username does not value exist is users then:
   users[data.roomname].push(user);
}
else{
   // New room
   users[data.roomname] = [user];
}

经过几次迭代,我们得到了这样的东西:

console.log ( 'Users: ', users );

users  { RoomABC:
   [ { YidwzgUHPHEGkQIPAAAD: 'Mr Chipps' },
     { 'JG-gtBMyPm0C1Hi1AAAF': 'Mr T' },
     { '2JFGMEdPbgjTgLGVAAAH': 'Mr Chipps' }, ] }

问题是试图确保每个用户名都是唯一的,因此如果该名称已经存在,则不应再次添加Mr Chipps

我看到的例子假设密钥是已知的。我已经尝试了很多东西,包括someindexOf,但我无法获得简单的"UserX是否已经存在"。

以下是我尝试添加的最新代码块,如果obj数组中还没有用户的话。这是可行的,但对我来说似乎很笨重;嵌套循环以在正确的级别检查值,如果找到匹配,则设置计数器,然后检查计数器以决定是否找到匹配:

if(users[data.roomname]){
  // Room already exists - check user already exists 
                
  let found = 0;
  // Nested loop - seems a little clunky but it works
  Object.keys(users[data.roomname]).forEach(key => {
     Object.keys(users[data.roomname][key]).forEach(key2 => {
         if ( users[data.roomname][key][key2] === data.username ) {
            found++;
         }
     });
  });
  if ( found == 0 ) {
     users[data.roomname].push(user);
  }
}

我一直在想,肯定有一条整洁的直线可以检查它的存在,但我无法找到任何一条。

您可以检查值,而不是使用键,如果发现名称,则可以提前退出

if (users[data.roomname]) {
    if (!Object.values(users[data.roomname]).some(v => Object.values(v).some(n => n === data.username))) {
        users[data.roomname].push(user);
    }
}

最新更新