2013-06-30 85 views
10

我正在聊天並使用數組來保存用戶。這是我的問題:Javascript Array Splice不改變索引

用戶1連接並通過推送在數組中被賦予索引0。 用戶2通過推送連接並被賦予數組中的索引1。

用戶1斷開連接並通過拼接移除。

NOW用戶2變爲索引0

User1的重新連接,並經由推給出索引1。

用戶2斷開連接,索引1被刪除,現在是User1。

這當然會造成問題。

所以我的問題是如何從數組中刪除項目而沒有其他元素的索引更改?我在這裏錯了嗎?

+0

只設置字段設置爲null – shift66

+1

_「當然,這是造成問題。」 _ - 「當然是」爲什麼呢?這可能是完全可以接受的,這取決於你的其他代碼如何使用數組。 (也就是說,您的其他代碼可以用不依賴於數組索引的方式編寫)。話雖如此,您可以使用對象而不是數組... – nnnnnn

回答

10

不是從splice()中刪除陣列中的項目,而是將值設置爲nullundefined

然後,當您添加新用戶時,只需掃描陣列即可找到第一個可用插槽。

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

謝謝您的回覆。我曾考慮過使用刪除,因爲它會比每個新用戶的索引增長並且索引增長非常大。你能解釋一下如何「掃描」並找到並將其分配給一個數組。更確切地說,如何掃描,如果可用則分配,然後如果不推進到最後? – Cyrus

+0

不得不編輯我的回覆,在事故中點擊輸入。 :/ – Cyrus

+1

假設您通過將某個插槽設置爲null來清除插槽,您可以使用'yourArray.indexOf(null)'獲取第一個可用插槽的索引。如果它返回'-1',這意味着沒有空條目,那麼你可以'.push()'。 – nnnnnn

4

另一種選擇是使用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性質的,所以你必須保持跟蹤你的最大用戶數自己。

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刪除數組元素是========== >> [ '一個', 'C', 'd','E ','f']

+1

這是如何改變索引的? c移至索引1,應該保持在2,除非我誤解OP問題。 – johnny

3

使用delete而不是splice

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

> delete a[1] 
< true 

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

> a.length 
< 3