【问题标题】:Javascript remove from array?Javascript从数组中删除?
【发布时间】:2026-02-11 19:35:01
【问题描述】:

我有这样的事情:

var users = [];

然后我用这个添加到列表中:

users[session] = socket;

现在我需要能够从会话和套接字相同的用户中删除

我该怎么做? (它需要是纯 javascript,而不是 jquery)

这是用于 socket.IO 的,如果有人知道那是什么的话。

var users = [];

////////////////USER CONNECTED
io.sockets.on('connection', function (socket) {
    socket.emit('connected');
    socket.on('session', function (session) {

 users[session] = socket;

 socket.emit("session_established");

 //ON USER DISCONNECTION/////
  socket.on('disconnect', function () { 

 //need to remove from the users list here, because they are no longer connected//

 socket.broadcast.emit('disconnect', { data : session});
 }); 

 });
 });

【问题讨论】:

  • 您没有按预期使用 JS 数组。实际上,您确实使用第一行代码创建了一个 JS 数组实例,但随后您使用方括号表示法来操作该数组对象的属性,而不是在数组中添加/操作项。结果,您混合了数组和对象的使用。为了向您展示我的意思,请尝试在您发布的第二行代码之后检查users.length...
  • 我已经更新了我的问题,显示了它的用途。
  • session 只是一个用户 ID,即:1 或者它可以是 81,或者 921

标签: javascript arrays socket.io


【解决方案1】:

那么,splice() 方法就是你的朋友了。 使用 delete 擦除索引。另外,使用

获取 id
for (var i in users){
if i == users[i]
...
}

【讨论】:

  • 除了具有数字索引的数组之外,您不能在任何东西上使用splice(),这可能不是,而且您的循环与此相矛盾。
【解决方案2】:

小心,当你这样做时:

var users = [];

users[session] = socket; 

您将得到一个数组,该数组的属性名称存储在会话变量中,也许您最好使用对象:

var users = {};

users[session] = socket; 

如果您这样做,那么您可以使用delete 删除该属性,如下所示:

delete users[session];

如果您确实需要使用数组,请查看 this link 并在方法部分中使用 push 将元素插入数组并使用 splice 删除它们


编辑

考虑到问题中添加的代码,我认为您可以执行以下操作:

var users = [], indexInArray;

indexInArray = users.push({session: session, socket: socket}); //add an object to the array, and store it's position, you could add whatever you like here
indexInArray--;

//Now you can access your recently added value like: users[indexInArray].session or users[indexInArray].socket

//and to delete it
users.splice(indexInArray , 1);

【讨论】:

  • 为什么需要遍历属性来删除一个属性?
  • 好吧,我曾经告诉过我应该使用 [],而我之前使用过 {}。
  • @DylanCross 也许您需要使用索引存储值。使用 [] 而不是 {} 并不意味着它不起作用,因为 javascript 中的所有内容都是对象,但是您声明了一个数组而不是像使用它一样使用它
  • 如果你能看看我的例子,(如果你还没有)你能不能给我一些帮助,因为这样做不会像我一样完美想要它,因为一个用户可以同时在两个不同的设备上,并且会话将是相同的数字,所以我需要一个允许多个会话的列表,但是通过套接字值,(这是一个大数据列表),并使用它从数组等中删除。
  • @DylanCross 好的,我将添加我认为可以帮助您进行编辑的内容。请记住,也许您必须根据您的问题对其进行一些调整
【解决方案3】:

试试这个:

for(var x in users) {
    if(users.hasOwnProperty(x) && x === users[x]) { // Might need ==, depending on your values
        delete users[x];
    }
}

【讨论】:

  • users[x] = undefined 不是必需的,因为该属性在下一行被删除
  • @AlexanderPavlov: 已经删除 :) 我最初把它放进去是因为我不记得 IE6 是否对delete 有问题。然后我意识到IE6无论如何都会死,所以我不在乎。