如何按索引删除数组?

时间:2018-10-13 07:00:28

标签: javascript node.js

我正在玩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);

,并且有效。您能帮我弄清楚如何从具有命名索引的数组中删除吗?

4 个答案:

答案 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