Javascript Array Splice без изменения индекса

Я работаю в чате и использую массив для хранения пользователей. Вот моя проблема:

Пользователь1 присоединяется и получает индекс 0 в массиве через push. Пользователь2 присоединяется и получает индекс 1 в массиве через push.

Пользователь1 отключается и удаляется с помощью сплайсинга.

СЕЙЧАС Пользователь2 становится индексом 0.

Пользователь1 повторно подключается и получает индекс 1 через push.

Пользователь2 отключается, и индекс 1 удаляется, что теперь является User1.

Это, конечно, вызывает проблему.

Итак, мой вопрос: как удалить элемент из массива без изменения индекса других элементов? Я нахожусь на неправильном пути здесь?

Ответ 1

Вместо того, чтобы удалять элементы из массива с помощью splice(), почему бы просто не установить значение null или 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;
}

Ответ 2

Другой вариант - использовать объект 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, тем не менее, вам нужно самому отслеживать свой максимальный номер пользователя.

Ответ 3

Используйте delete вместо splice.

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

> delete a[1]
< true

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

> a.length
< 3

Ответ 4

удалить элементы массива без проблемы переиндексации

    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 is ========== → ['a', 'c', 'd', 'e', ​​'f']