微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

检查 Javascript 嵌套的 obj 值是否存在,密钥未知

如何解决检查 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);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。