Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查Javascript嵌套obj值是否存在且键未知_Javascript_Arrays_Javascript Objects_Key Value - Fatal编程技术网

检查Javascript嵌套obj值是否存在且键未知

检查Javascript嵌套obj值是否存在且键未知,javascript,arrays,javascript-objects,key-value,Javascript,Arrays,Javascript Objects,Key Value,以下内容用于构建对象数组: 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].pus

以下内容用于构建对象数组:

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)

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

我所看到的例子假设钥匙是已知的。我尝试了很多方法,包括
一些
索引
,但我无法让一个简单的“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(用户[data.roomname]){
如果(!Object.values(users[data.roomname]).some(v=>Object.values(v).some(n=>n==data.username))){
用户[data.roomname].push(用户);
}
}

如果一个用户是唯一的,您不允许第二个用户使用相同的名称,那么为什么不使用用户名作为密钥而不是套接字ID?您可以使用一个集合并具有各种内置事件methods@mplungjan我继承了这段代码,正在慢慢地尝试消除一些bug。我认为关键是代码其他部分的重要价值。我只想一次解决一个问题,第一个问题是重复用户问题。@TenG使用它的值作为键,而不是唯一的键,比如
User={[data.username]:[socket.id]}
fabric。非常感谢。
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);
  }
}