2013-07-09 34 views
7

Tôi đã thử nghiệm cách splice hoạt động trong khi lặp qua một mảng và không hiểu tại sao 0 vẫn nằm trong danh sách?Tại sao 0 không bị xóa khỏi danh sách?

var array = [2, 5, 9, 14, 0, 1, 3, 6, 7]; 
for (var i = 0; i < array.length; i++) { 
    if (array[i]%2 == 0) { 
     array.splice(i,1); 
    } 
} 

//0 % 2 == 0 is true, and yet 
//array = [5, 9, 0, 1, 3, 7] 
+6

Bạn không lặp lại tất cả các giá trị, bạn phải lặp lại vì mảng được lập lại trên mỗi mối nối. – bfavaretto

+1

có cảm giác có thể xảy ra, nhưng không thiết lập trường hợp thử nghiệm đủ tốt ... nhưng mẹo hay về việc lặp lại +1! – user1766760

+0

muốn số nguyên lẻ? [2, 5, 9, 14, 0, 1, 3, 6, 7] .filter (/./. Test,/[13579] $ /) – dandavis

Trả lời

10

0 là nhận bỏ qua

Bạn đang biến đổi (thay đổi) mảng trong khi bạn đang iterating qua nó. Đây là một chương trình không đi.

Hãy xem qua ...

i = 0 và 2 là chẵn và được ghép, mảng của bạn bây giờ là [5, 9, 14, 0, 1, 3, 6, 7]

i = 1 và chúng tôi thậm chí không kiểm tra 5 có trong chỉ mục 0 bây giờ ... chúng tôi hiện đang kiểm tra 9 là số lẻ, tốt

i = 2 và 14 là ngay cả và được nối, mảng của bạn bây giờ [5, 9, 0, 1, 3, 6, 7]

i = 3 và 0 bị bỏ qua (vì 0 nằm trong chỉ mục 2 bây giờ), 1 là lẻ, tốt

i = 4 là số lẻ mỹ

i = 5 là chẵn và được ghép

i = 6 là số lẻ mỹ

gì bạn thực sự muốn là này ...

Array.prototype.filter = function(func) { 
    var result = new Array(); 
    for (var i = 0; i < this.length; ++i) 
    if (func(this[i])) 
     result.push(this[i]); 
    return result; 
} 

values = [2, 5, 9, 14, 0, 1, 3, 6, 7]; 
odd_only = values.filter(function(x) { x % 2 != 0; }); 
+0

yep, nó sẽ rất rõ ràng nếu tôi thiết lập vài con số thậm chí còn hơn trong một cuộn. Từ câu trả lời của bfavaretto, có vẻ như tôi có thể nhận được nếu tôi lặp lại ... không làm hại (?) – user1766760

+0

bạn có thể lặp lại trong ví dụ này, nhưng việc thay đổi mảng trong khi lặp qua vẫn không phải là cách thực hành lập trình tuyệt vời –

+0

'nếu (! (bộ lọc trong Array.prototype)) ' – bfavaretto

6

Mỗi khi bạn loại bỏ một giá trị khỏi mảng, bạn bỏ qua một giá trị theo sau, bởi vì mảng được tái lập trên mỗi mối nối. Thay vào đó, bạn có thể lặp lại thay thế:

var array = [2, 5, 9, 14, 0, 1, 3, 6, 7]; 
for (var i = array.length-1; i >= 0; i--) { 
    if (array[i]%2 == 0) { 
     array.splice(i,1); 
    } 
} 
+0

biến đổi một mảng trong khi lặp qua nó không phải là thực hành lập trình tuyệt vời –

+0

Đó là ý kiến ​​của bạn. Nó chắc chắn có thể được thực hiện một cách an toàn. – bfavaretto

2

Nó bỏ qua 0 vì mối nối lại lập chỉ mục mảng. sử dụng điều này:

var array = [2, 5, 9, 14, 0, 1, 3, 6, 7]; 
for (var i = 0; i < array.length; i++) { 
    if (array[i]%2 == 0) { 
     array.splice(i,1); 
     i = i - 1; 
    } 
} 
+0

nó sẽ lặp lại toàn bộ mảng? – Notepad

+1

có nó sẽ lặp lại toàn bộ mảng –

+0

nó sẽ lặp qua toàn bộ mảng và cũng sẽ xử lý phần tử đầu tiên và cuối cùng. – Gyandeep

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