我正在聊天並使用數組來保存用戶。這是我的問題:Javascript Array Splice不改變索引
用戶1連接並通過推送在數組中被賦予索引0。 用戶2通過推送連接並被賦予數組中的索引1。
用戶1斷開連接並通過拼接移除。
NOW用戶2變爲索引0
User1的重新連接,並經由推給出索引1。
用戶2斷開連接,索引1被刪除,現在是User1。
這當然會造成問題。
所以我的問題是如何從數組中刪除項目而沒有其他元素的索引更改?我在這裏錯了嗎?
我正在聊天並使用數組來保存用戶。這是我的問題:Javascript Array Splice不改變索引
用戶1連接並通過推送在數組中被賦予索引0。 用戶2通過推送連接並被賦予數組中的索引1。
用戶1斷開連接並通過拼接移除。
NOW用戶2變爲索引0
User1的重新連接,並經由推給出索引1。
用戶2斷開連接,索引1被刪除,現在是User1。
這當然會造成問題。
所以我的問題是如何從數組中刪除項目而沒有其他元素的索引更改?我在這裏錯了嗎?
不是從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;
}
另一種選擇是使用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
性質的,所以你必須保持跟蹤你的最大用戶數自己。
而不面向重新索引問題
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']
這是如何改變索引的? c移至索引1,應該保持在2,除非我誤解OP問題。 – johnny
使用delete
而不是splice
。
> a = ['1', '2', '3']
< Array [ "1", "2", "3" ]
> delete a[1]
< true
> a
< Array [ "1", undefined × 1, "3" ]
> a.length
< 3
只設置字段設置爲null – shift66
_「當然,這是造成問題。」 _ - 「當然是」爲什麼呢?這可能是完全可以接受的,這取決於你的其他代碼如何使用數組。 (也就是說,您的其他代碼可以用不依賴於數組索引的方式編寫)。話雖如此,您可以使用對象而不是數組... – nnnnnn