我正在玩nodejs和socket.io,我想存储用户套接字ID和名称。 我做了一个构造器
function user(socketid,name){
this.socketid = socketid;
this.name = name;
this.getName = function(){
return this.name;
};
this.getId = function(){
return this.socketid;
};
}
我正在将它们插入这样的数组中
users[socket.id] = new user(socket.id,'jirka');
这会导致用户像这样
[ '/chat#nksuCQdzHgBwO7x8AAAA': user {
socketid: '/chat#nksuCQdzHgBwO7x8AAAA',
name: 'jirka',
getName: [Function],
getId: [Function] },
'/chat#nmORiKZ9xzklDuUCAAAB': user {
socketid: '/chat#nmORiKZ9xzklDuUCAAAB',
name: 'jirka',
getName: [Function],
getId: [Function] } ]
现在在断开连接事件中,我想通过它们的socket.id从数组中删除它们
users.splice(socket.id,1);
但是它不起作用。当我在数组中没有命名索引并遍历它们并与套接字id匹配时执行此操作时,我将使用迭代器将其删除
users.splice(i,1);
,并且有效。您能帮我弄清楚如何从具有命名索引的数组中删除吗?
答案 0 :(得分:2)
我的回答涉及问题的解决,但与您的具体要求无关。这是最好的地方之一,适合使用“地图”数据类型。因此,我将举一个小例子来展示操作-
let socketStore = new Map();
//when you have something to store - a socketId and data
socketStore.set(socketId, data)
// when you want to delete the socketId
socketStore.delete(socketId)
一个非常好的Map参考-https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
答案 1 :(得分:0)
delete users[socket.id]
却没有命名索引,但是仍然有效,并且未定义索引
奇怪的
答案 2 :(得分:0)
在您的情况下,您有一个对象数组,因此您必须这样做:
users = users.filter( user => users.getId() != current_socket_id );
答案 3 :(得分:0)
当心你在做什么。
数组也是普通对象。在数组部分,您可以设置索引存储的项目并在其上使用数组功能,例如# Get a list of user keychains, make a note of the names
security list-keychains -d user
# Create a new keychain
security create-keychain -p password MyNew.keychain
# Adjust the 'references' by rewriting the search list
security list-keychains -s MyNew.keychain <space separated list of other keychains>
# Delete the keychain
security delete-keychain MyNew.keychain
;在经典对象部分,可以向其添加属性。
没有像数组中的命名索引这样的东西。
执行slice
,将新属性添加到对象,而不是在数组部分。因此,它与users[socket.id] = new user(socket.id,'jirka');
无关。
要删除属性,只需使用以下命令:slice