2013-06-30 16 views
10

Pracuję nad czatem i korzystam z tablicy do przechowywania użytkowników. Oto mój problem:Splat Array JavaScript bez zmiany indeksu

Użytkownik1 dołącza i otrzymuje indeks 0 w tablicy za naciśnięciem przycisku. User2 dołącza i otrzymuje indeks 1 w tablicy za pomocą polecenia push.

Użytkownik 1 rozłącza się i jest usuwany za pomocą splice.

TERAZ User2 staje indeksem 0.

User1 ponownie łączy i jest podany indeks 1 poprzez naciśnięcie.

Użytkownik 2 rozłącza się, a Indeks 1 zostaje usunięty i jest teraz Użytkownikiem1.

To oczywiście powoduje problem.

Moje pytanie brzmi: jak mogę usunąć przedmiot z tablicy bez zmiany indeksu innych elementów? Czy jestem tutaj na niewłaściwym torze?

+0

wystarczy ustawić pole null – shift66

+1

_ "To oczywiście powoduje problem." _ - Dlaczego "oczywiście"? Może to być całkowicie dopuszczalne, w zależności od tego, jak twój drugi kod używa tablicy. (Oznacza to, że twój drugi kod mógłby być napisany w sposób, który nie jest zależny od indeksów tablicy.) Powiedziawszy to, możesz użyć obiektu zamiast tablicy ... – nnnnnn

Odpowiedz

10

Zamiast usuwać elementy z tablicy przy pomocy splice(), dlaczego nie wystarczy ustawić wartości na null lub undefined?

Następnie, dodając nowego użytkownika, można po prostu zeskanować tablicę, aby znaleźć pierwsze dostępne gniazdo.

Tablice javascript to po prostu lista elementów - nie są one przypisane do konkretnego klucza, tak jak w PHP. Jeśli chcesz zachować tę samą pozycję w tablicy, nie możesz usunąć innych elementów - musisz je zachować i po prostu oznaczyć je jako puste.


może skanować przez coś takiego:

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; 
} 
+0

Dziękuję za odpowiedź. Rozważałem użycie usuwania, ponieważ byłoby to lepsze niż wzrost indeksu z każdym nowym użytkownikiem i wzrost indeksu bardzo duży.Czy mógłbyś wyjaśnić, jak "przeskanować" i znaleźć, a następnie przypisać go do tablicy. A dokładniej, jak skanować, przypisywać, jeśli to możliwe, a potem, jeśli nie, dopuścić do końca? – Cyrus

+0

Musiał edytować odpowiedź, naciśnij enter w razie wypadku. :/ – Cyrus

+1

Zakładając, że "wyczyścisz" slot, ustawiając go na 'null', możesz użyć' yourArray.indexOf (null) ', aby uzyskać indeks pierwszego dostępnego gniazda. Jeśli zwróci "-1", oznacza to, że nie ma żadnych pustych wpisów, więc możesz ".push()". – nnnnnn

4

Inną opcją jest użycie JavaScript Object zamiast tablicy.

coś takiego:

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" 

Tracisz tablicę length nieruchomość choć, więc musisz śledzić liczbę użytkowników max samodzielnie.

1

usunąć elementy macierzy nie napotykając problemów reindeksacji

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; 
    }}); 

teraz ARR2 jest ========== >> [ 'a', 'c', 'd', "e ',' f ']

+1

Jak to nie zmieniło indeksu? c przeniósł się do indeksu 1, który ma pozostać na poziomie 2, chyba że źle zrozumiem pytanie OP. – johnny

3

Użyj delete zamiast splice.

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

> delete a[1] 
< true 

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

> a.length 
< 3