2013-07-09 13 views
7

Sprawdzałem, jak działa splice podczas iteracji przez tablicę i nie rozumiem, dlaczego 0 pozostało na liście?Dlaczego 0 nie jest usuniętych z listy?

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

Nie jesteś iteracji wszystkie wartości, trzeba pętli wstecz, ponieważ tablica jest przeindeksowane na każdym spawu. – bfavaretto

+1

miał wrażenie, że może się zdarzyć, ale nie skonfigurował testu wystarczająco dobrze ... ale fajna wskazówka na temat iteracji wstecznej +1! – user1766760

+0

chcesz nieparzystych liczb całkowitych? [2, 5, 9, 14, 0, 1, 3, 6, 7] .filtr (/./. Test,/[13579] $ /) – dandavis

Odpowiedz

10

0 jest uzyskiwanie pominięte

Jesteś mutacji (zmiana) tablicę gdy jesteś iteracja niego. To jest programowanie bez użycia.

Omówmy ...

i = 0 i 2 jest nawet i dostaje łączone Twoja tablica jest teraz [5, 9, 14, 0, 1, 3, 6, 7]

i = 1 i nawet nie sprawdziliśmy 5, które jest teraz w indeksie 0 ... teraz sprawdzamy 9, które jest nieparzyste, dobrze

i = 2 i 14 jest równe i zostaje splicowane, twoja tablica jest teraz [5, 9, 0, 1, 3, 6, 7]

i = 3 i 0 zostaje pominięte (ponieważ 0 jest teraz w indeksie 2), 1 jest nieparzyste, dobrze

i = 4 jest nieparzysta porządku

i = 5 i dostać nawet łączone

i = 6 jest nieparzysta porządku

Co naprawdę chcesz to jest ...

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

tak, to byłoby tak oczywiste, jeśli skonfiguruję kilka liczb parzystych w rolce. Z odpowiedzi bfavaretto wydaje mi się, że mogę przejść przez iterację wstecz ... nie zrobiłem żadnej szkody (?) – user1766760

+0

można powtórzyć od tyłu w tym przykładzie, ale mutowanie tablicy podczas iteracji nie jest jeszcze dobrą praktyką programowania –

+0

'jeśli (! (filter in Array.prototype)) ' – bfavaretto

6

Za każdym razem, gdy usuniesz wartość z tablicy, pomijasz tę, która następuje po niej, ponieważ tablica jest ponownie indeksowana w każdym splice. Zamiast tego możesz wykonać pętlę wsteczną:

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

mutowanie tablicy podczas iteracji przez nią nie jest świetną praktyką programowania –

+0

To twoja opinia. Z pewnością można to zrobić bezpiecznie. – bfavaretto

2

Pomija 0, ponieważ splice ponownie indeksują tablicę. użyj:

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

będzie iterować całą tablicę? – Notepad

+1

tak powinno iterować całą tablicę –

+0

będzie iterować przez całą tablicę, a także zajmie się pierwszym i ostatnim elementem również. – Gyandeep

Powiązane problemy