【问题标题】:Check if key exists in an array and replace its value检查键是否存在于数组中并替换其值
【发布时间】:2017-11-17 09:53:11
【问题描述】:

客户代码

我正在使用

从客户端发送客户端的 id
var socket = io.connect('http://localhost:8080?token='+userID);

并在我的 io.on('connection') 中的服务器上获取它 函数使用

服务器代码

let token = socket.handshake.query.token;

所以现在我将 userID 存储在变量 token 中。

我也正在获取连接的 socket id 并将其存储为

var id = socket.id;

然后我将 userIDsocketID 作为键值对存储在一个数组中。

var item = {};
item[token] = id;

这是一个我要推入的数组(该数组是在 on 连接函数之外声明的)

keyPairArray.push(item);

所以当两个人连接时,我会得到一个这样的数组。

[ { '10': 'HvlunYNFCcF5vK0-AAAA' },
  { '1456': '17XF7mbh4vYr2WUSAAAB' } ]

但是当任何用户重新加载页面时,数组就会变成这样

[ { '10': 'HvlunYNFCcF5vK0-AAAA' },
  { '1456': '17XF7mbh4vYr2WUSAAAB' },
  { '1456': 'tIhvkxFbSSAQEckWAAAC' } ]

用户 ID 相同,但 套接字 ID 不同。

每次用户重新加载页面或在另一个选项卡中打开页面时,socket id 都会发生变化,并且将相同的 UserID 附加到具有不同 的数组中套接字 ID.

我不想再次插入同一个用户。如果用户重新加载页面,我希望它检查数组中的键 userId 并将旧的 socket id 替换为新生成的。

这是我没有运气尝试的代码

var checkKeyPair = keyPairArray.some(function(item){
    return item[token] === id;
});

if(checkKeyPair){
    console.log("Hello");
}else{
    keyPairArray.push(item);
    console.log(keyPairArray);
}

【问题讨论】:

  • 如果您想将每个项目与所有其他项目进行比较,您需要进行嵌套搜索。

标签: javascript arrays node.js sockets


【解决方案1】:

试试这个(如果 ES6 不是问题):

let token = socket.handshake.query.token;
var id = socket.id;
var item = { [token]: id };
var index = keyPairArray.findIndex(it => Object.keys(it)[0] === token);
if (index === -1) {
    keyPairArray.push(item);
} else {
    keyPairArray[index] = item;
}

【讨论】:

  • 我能否将相同的代码放入我的on.disconnect 函数中,并将.push 替换为.splice,并在用户断开连接时从数组中删除用户对象。
  • 不,你不能。如果只是将 push 替换为 splice 将不起作用
  • 你必须这样做: if (index !== -1) { keyPairArray.splice(index, 1); }
【解决方案2】:

您可以将Array#someObject.keys 结合起来检查是否存在具有给定userId 的用户,类似这样:

const users = [{
    '10': 'HvlunYNFCcF5vK0-AAAA'
  },
  {
    '1456': '17XF7mbh4vYr2WUSAAAB'
  }
];

function checkIfUserExists(userId) {
  return users.some((user) => Object.keys(user).indexOf(userId) > -1)
}

console.log(checkIfUserExists('10'));
console.log(checkIfUserExists('11'));

【讨论】:

  • 这行得通。当我记录它时,我变得真实。之后我就可以进行操作了。
【解决方案3】:

var users = [{
    '10': 'HvlunYNFCcF5vK0-AAAA'
  },
  {
    '1456': '17XF7mbh4vYr2WUSAAAB'
  }
];



function saveUser(newUserId) {


  users.forEach(function(key) {

    if (Object.keys(key)[0] == newUserId)
      console.log('user exists');
    else {
      var item = {};
      item[newUserId] = 'fsdfsdgdfsgdfhgf55665hftgh56';
      users.push(item);
    }
  });
}

saveUser('1456');

【讨论】:

  • 请解释你修复了什么
猜你喜欢
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多