2012-02-20 30 views
8

3 giờ trước, tôi đã hỏi một câu hỏi trong SO, về việc xóa một phần của một đối tượng, vì vậy tôi liên kết câu hỏi này với nó:Xóa từ mảng trong javascript

delete a part of object in javascript

nhưng bây giờ vấn đề khác xảy ra khi Tôi đã xóa nó khỏi mảng đó. Tôi sử dụng đối tượng đó để điền một FlexiGrid. nhưng khi tôi xóa một mục từ đối tượng đó bằng cách làm theo mã, thay vì xóa mục đó, nó đặt để xác định :(và Flexigrid không chấp nhận nó cho dữ liệu đầu vào.

for (var i = 0; i < Roomdata.length; i++) { 

    if(Roomdata[i].id = X) { 

     delete Roomdata[i]; 
     break; 

    } 
}     

Ví dụ, hãy tưởng tượng tôi có 3 mặt hàng trong Roomdata như thế này:

{item1, item2, item3} 

Khi tôi gọi mã này để xóa ITEM2, Roomdata đối tượng trông như thế này:

{item1, undefined, item3} 

và đây là một định dạng xấu để được chấp nhận bởi Flexigrid như dữ liệu đầu vào

Có giải pháp nào không?

Cảm ơn tất cả các cơ thể và xin lỗi về cú pháp xấu của tôi (Tôi mới bằng tiếng Anh)

regards, Foroughi

+0

trùng lặp có thể xảy ra [Javascript Mảng Xóa Elements] (http://stackoverflow.com/questions/500606/javascript-array-delete-elements) - vui lòng sử dụng tìm kiếm trước khi bạn Đặt một câu hỏi. –

+0

Câu trả lời được chấp nhận cho câu hỏi trước của bạn đã đề xuất sử dụng 'splice'. Tại sao bạn lại hỏi câu hỏi này? –

+0

Xin lỗi @Felix, nhưng tôi nghĩ vì tôi đã đặt câu hỏi về vấn đề này, tôi đã hỏi câu hỏi này để giúp người đọc đọc câu hỏi dễ hiểu hơn, dù sao xin lỗi về điều đó –

Trả lời

49

Đi qua mảng theo thứ tự ngược lại và sử dụng .splice để xóa phần tử.
Bạn phải đi theo thứ tự ngược lại, bởi vì nếu không bạn sẽ bỏ qua các phần tử Xem bên dưới.

for (var i = Roomdata.length-1; i >= 0; i--) { 
    if (Roomdata[i].id == X) { 
     Roomdata.splice(i, 1); 
     break; 
    } 
} 

gì xảy ra nếu bạn không đi theo thứ tự ngược lại:

// This happens in a for(;;) loop: 
// Variable init: 
var array = [1, 2, 3]; 
var i = 0; 

array.splice(i, 1); // array = [2, 3] array.length = 2 
// i < 2, so continue 
i++; // i = 1  

array.splice(i, 1); // i=1, so removes item at place 1: array = [2] 
// i < 1 is false, so stop. 

// array = [2]. You have skipped one element. 
+1

Cảm ơn bạn đã trả lời đầy đủ và bình luận của nó, dù sao bạn giúp tôi và bạn là tuyệt vời, cảm ơn một lần nữa –

+2

Bạn không cần phải đi qua các yếu tố theo thứ tự ngược lại như bạn đang chấm dứt vòng lặp sau khi bạn gọi 'splice' anyway. Nếu bạn muốn loại bỏ nhiều phần tử khỏi một mảng, thì có, nhưng trong trường hợp này, nó không cần thiết. –

+0

@ FelixKling Bạn nói đúng. Tuy nhiên, vì câu trả lời được chấp nhận ở câu hỏi khác không có tác dụng, tôi giả định rằng 'ngắt;' phải được loại bỏ. –

4

gì bạn có là một Mảng. Bạn nên sử dụng các splice() method để loại bỏ một phần tử khỏi một mảng, không phải bằng cách delete nhập phần tử.

for (var i = 0; i < Roomdata.length; i++) { 

    if(Roomdata[i].id = X) { 

     Roomdata.splice(i, 1); 
     break; 

    } 
} 
+2

Đối số thứ hai xác định số lượng mục cần xóa. ** '.splice (i, 0)' không loại bỏ bất cứ điều gì **. Ngay cả khi bạn thay thế nó bằng '.splice (i, 1)', bạn đang bỏ qua các phần tử bằng cách không tính chỉ số đã thay đổi. –

+0

@RobW: Rất tiếc. Và như đối với các yếu tố bỏ qua, anh ấy vẫn đang loại bỏ việc xóa bỏ, vì vậy các thông báo sẽ bị bỏ qua. – Matt

3

Sử dụng mối nối mặc dù xóa.

Roomdata.splice(i, 0); 

thuộc tính mối nối sẽ xóa phần tử chuỗi trống, tham chiếu không xác định, NULL và FALSE.

nó sẽ giải quyết vấn đề của bạn

Các vấn đề liên quan