2013-06-30 8 views
10

Ich arbeite an einem Chat und ein Array verwenden, um die Benutzer zu halten. Hier ist mein Problem:Javascript Array Splice ohne den Index zu ändern

User1 verbindet und Index 0 im Array über Push gegeben. User2 tritt hinzu und erhält Index 1 im Array per Push.

Benutzer1 trennt und wird über Spleiß entfernt.

JETZT User2 wird Index 0.

User1 wieder verbindet und Index 1 per Push gegeben.

User2 trennt, und Index 1 wird entfernt, was User1 ist jetzt.

Dies verursacht natürlich ein Problem.

So ist meine Frage, wie kann ich das Element aus dem Array ohne den Index der anderen Elemente zu ändern entfernen? Bin ich hier auf der falschen Spur?

+0

setzen nur das Feld – shift66

+1

auf null _ "Das ist natürlich ein Problem verursacht." _ - Warum "natürlich"? Dies kann vollkommen akzeptabel sein, abhängig davon, wie Ihr anderer Code das Array verwendet. (Das heißt, Ihr anderer Code könnte so geschrieben werden, dass er nicht von den Array-Indizes abhängt.) Nachdem Sie das gesagt haben, könnten Sie ein Objekt anstelle eines Arrays verwenden ... – nnnnnn

Antwort

10

Anstatt die Elemente aus dem Array mit splice() zu entfernen, warum nicht einfach den Wert auf null oder undefined setzen?

Dann, wenn Sie einen neuen Benutzer hinzufügen, können Sie nur durch das Array scannen Sie den ersten verfügbaren Steckplatz zu finden.

JavaScript-Arrays sind einfach Listen von Elementen - sie sind zu einem bestimmten Schlüssel nicht eingegeben, wie Sie mit in PHP vertraut sein könnten. Wenn Sie also die gleiche Position im Array beibehalten möchten, können Sie keine anderen Elemente entfernen. Sie müssen sie beibehalten und sie einfach als leer markieren.


Sie könnte wie folgt scannen durch:

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

Vielen Dank für Ihre Antwort. Ich hatte überlegt, das Löschen zu verwenden, da es besser wäre, wenn der Index mit jedem neuen Benutzer wächst und der Index sehr groß wird.Könntest du bitte erklären, wie man "scannt" und finde und dann einem Array zuweisen. Genauer gesagt, wie scannen, zuweisen, wenn verfügbar, und dann, wenn nicht bis zum Ende drücken? – Cyrus

+0

Hatte meine Antwort zu bearbeiten, drücken Sie Enter bei Unfall. :/ – Cyrus

+1

Angenommen, Sie löschen einen Slot, indem Sie ihn auf "null" setzen, können Sie 'yourArray.indexOf (null)' verwenden, um den Index des ersten verfügbaren Slots zu erhalten. Wenn es "-1" zurückgibt, bedeutet das, dass es keine Null-Einträge gibt, also können Sie '.push()'. – nnnnnn

4

Eine weitere Option ist ein JavaScript-Objekt anstelle eines Arrays zu verwenden.

Etwas wie folgt aus:

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" 

Sie verlieren das Array length Eigenschaft obwohl, so dass Sie sich den Überblick über Ihre max Benutzernummer halten musst.

1

Entfernen Array-Elemente ohne erneute Indexierung Problem konfrontiert

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

jetzt ARR2 ist ========== >> [ 'a', 'c', 'd', 'e ‘, 'f']

+1

Wie hat das den Index nicht verändert? c ging zu Index 1, der bei 2 bleiben soll, wenn ich die OP-Frage nicht falsch verstehe. – johnny

3

Verwenden delete statt splice.

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

> delete a[1] 
< true 

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

> a.length 
< 3 
Verwandte Themen