2013-06-30 39 views
10

Tôi đang làm việc trên một cuộc trò chuyện và sử dụng một mảng để giữ người dùng. Đây là vấn đề của tôi:Ghép mảng Javascript mà không thay đổi chỉ mục

User1 tham gia và được cung cấp chỉ mục 0 trong mảng thông qua đẩy. User2 tham gia và được chỉ số 1 trong mảng thông qua đẩy.

Người dùng1 ngắt kết nối và bị xóa qua mối nối.

NGAY BÂY GIỜ Người dùng 2 trở thành Chỉ số 0.

User1 kết nối lại và được chỉ số 1 qua đẩy.

Ngắt kết nối người dùng2 và chỉ mục 1 bị xóa hiện là User1.

Điều này tất nhiên gây ra sự cố.

Vì vậy, câu hỏi của tôi là làm thế nào tôi có thể loại bỏ các mục từ mảng mà không có chỉ mục của các yếu tố khác thay đổi? Tôi đang đi sai đường ở đây à?

+0

chỉ cần thiết lập các lĩnh vực null – shift66

+1

_ "Đây là tất nhiên gây ra một vấn đề." _ - Tại sao "tất nhiên"? Điều này có thể được chấp nhận hoàn toàn tùy thuộc vào cách mã khác của bạn sử dụng mảng. (Tức là, mã khác của bạn có thể được viết theo cách không phụ thuộc vào chỉ mục mảng.) Có nói rằng, bạn có thể sử dụng một đối tượng thay cho mảng ... – nnnnnn

Trả lời

10

Thay vì xóa các mục khỏi mảng bằng splice(), tại sao không chỉ đặt giá trị thành null hoặc undefined?

Sau đó, khi bạn thêm người dùng mới, bạn chỉ có thể quét qua mảng để tìm khe có sẵn đầu tiên.

mảng javascript chỉ đơn giản là danh sách các mục - chúng không được khóa cho một khóa cụ thể như bạn có thể đã quen thuộc với PHP. Vì vậy, nếu bạn muốn giữ cùng vị trí trong mảng, bạn không thể xóa các mục khác - bạn cần giữ chúng và chỉ đánh dấu chúng là rỗng.


Bạn có thể quét qua một cái gì đó như thế này:

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

Cảm ơn bạn đã trả lời. Tôi đã cân nhắc việc sử dụng lệnh xóa vì nó sẽ tốt hơn là việc chỉ mục phát triển với mỗi người dùng mới và có chỉ mục tăng rất lớn.Bạn có thể giải thích làm thế nào để "quét qua" và tìm và sau đó gán nó vào một mảng. Chính xác hơn làm thế nào để quét, gán nếu có, và sau đó nếu không đẩy đến cùng? – Cyrus

+0

Đã phải chỉnh sửa câu trả lời của tôi, nhấn enter do tai nạn. :/ – Cyrus

+1

Giả sử bạn "xóa" một vị trí bằng cách đặt nó thành 'null', bạn có thể sử dụng' yourArray.indexOf (null) 'để lấy chỉ mục của vị trí đầu tiên có sẵn. Nếu nó trả về '-1' có nghĩa là không có các mục rỗng, thì bạn có thể' .push() '. – nnnnnn

4

Một lựa chọn khác là sử dụng một đối tượng javascript thay vì một mảng.

Something như thế này:

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" 

Bạn mất mảng length bất động sản mặc dù, vì vậy bạn sẽ phải theo dõi số lượng người sử dụng tối đa của bạn mình.

1

phần tử mảng loại bỏ mà không cần phải đối mặt với vấn đề tái lập chỉ mục

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

tại arr2 là ========== >> [ 'a', 'c', 'd', 'e ',' f ']

+1

Làm thế nào điều này không thay đổi chỉ mục? c chuyển sang chỉ số 1 được cho là vẫn ở mức 2, trừ khi tôi hiểu nhầm câu hỏi OP. – johnny

3

Sử dụng delete thay vì splice.

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

> delete a[1] 
< true 

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

> a.length 
< 3 
Các vấn đề liên quan