17

我正在聊天并使用数组来保存用户。这是我的问题:

User1 加入并通过推送在数组中获得索引 0。User2 加入并通过推送获得数组中的索引 1。

User1 断开连接并通过拼接移除。

现在 User2 变为索引 0。

User1 重新连接并通过推送获得索引 1。

User2 断开连接,索引 1 被删除,现在是 User1。

这当然会引起问题。

所以我的问题是如何在不改变其他元素索引的情况下从数组中删除该项目?我在这里走错了吗?

4

5 回答 5

16

splice()为什么不将值设置为nullor ,而不是从数组中删除项目undefined

然后,当您添加新用户时,您只需扫描阵列即可找到第一个可用插槽。

javascript 数组只是项目的列表——它们并不像您在 PHP 中熟悉的那样与特定的键绑定。因此,如果您想在数组中保持相同的位置,则不能删除其他项目 - 您需要保留它们,并将它们标记为空。


您可能会浏览以下内容:

var users = [];
function addUser(user) {
    var id = users.indexOf(null);
    if (id > -1) {
        // found an empty slot - use that
        users[id] = user;
        return id;
    } else {
        // no empty slots found, add to the end and return the index
        users.push(user);
        return users.length - 1;
    }
}
function removeUser(id) {
    users[id] = null;
}
于 2013-06-30T05:56:12.083 回答
13

使用delete而不是splice.

> a = ['1', '2', '3']
< Array [ "1", "2", "3" ]

> delete a[1]
< true

> a
< Array [ "1", undefined × 1, "3" ]

> a.length
< 3
于 2017-06-01T07:52:35.780 回答
6

另一种选择是使用 javascript 对象而不是数组。

像这样的东西:

var users = {};

users[1] = 'user 1';
users[2] = 'user 2';

delete users[1];
alert(users[2]);        // alerts "user 2"
alert(typeof users[1]); // alerts "undefined"

但是,您会丢失数组length属性,因此您必须自己跟踪最大用户数。

于 2013-06-30T06:04:22.743 回答
0

我敢肯定,根据您的具体情况,有多种解决方案可以发挥作用。我有一个使用 React 的项目,并且在将数组中的对象设置为未定义时遇到了类似的问题,因为在代码的其他地方我会收到类似的错误cannot find {key} of undefined......同样的事情发生在null......我现在可以正常工作的解决方案是只需重新创建整个数组,在我的情况下我可以这样做,因为它不是一个超长的列表。更改以适合您的描述:

let newUsers = [];
users.forEach((u, i) => {
  if (u.isOnline) newUsers[i] = u;
});
this.setState({ users: newUsers });

……大意的东西。就我而言,我有一个选定食谱的列表。如果食谱从食谱的整体列表中删除,这会将其从选择列表中删除,其中选定的索引指示它是哪个“课程”(即开胃菜、主菜、甜点),因此索引很重要。

另一种解决方案可能是使用您的用户 ID 作为数组的索引。当用户上线时,您可以设置onlineUsers[user.ID] = user //or true or user.Name or whatever

于 2020-01-20T18:46:41.580 回答
-1

删除数组元素而不面临重新索引问题

    var ind=[1,6]; //index positions of elements to remove
    var arr=['a','b','c','d','e','f','g']; // actual array
    var arr2 = arr.filter(function(item,index){
            if(ind.indexOf(index)== -1){
            return true;
    }});

现在 arr2 是 ==========>> ['a','c','d','e','f']

于 2017-03-23T09:27:09.910 回答