Próbuję usunąć wszystkie numery nawet z tablicy, ale po prostu nie usuwa ich wszystkich. nie pewny dlaczego

 var arr = [3,45,56,7,88,56,34,345];    
    for (var i = 0; i < arr.length; i++) {
      if (arr[i] % 2 === 0) {
        arr.splice(i,1);
      }
    }

console.log(arr); daje to - [3, 45, 7, 56, 345] zamiast tego [3, 45, 7, 345]

Jakieś pomysły?

7
user3566643 15 sierpień 2014, 04:06

5 odpowiedzi

Najlepsza odpowiedź

Tak, to dlatego, że gdy rozliczasz 1 element z tablicy zmienia się długość tablicy. Spróbuj tego -

var arr = [3,45,56,7,88,56,34,345];

for (var i = 0; i < arr.length; i++) {
  if (arr[i] % 2 === 0) {
    arr.splice(i,1);
    i = i-1; // SINCE YOU DELETED ONE ELEMENT, 
             // THE NEXT ELEMENT IN THE ARRAY GETS SHIFTED TO ONE POSITION ABOVE 
             //(SAY, FROM INDEX 4 TO 3). SO, YOU WILL NEED TO CHECK FROM INDEX 3 NOT 4
  }
}
7
Cute_Ninja 20 sierpień 2014, 16:58

Po usunięciu 88, 56 następujący przesuwa się do jednej pozycji, a pętla pomija ją (po prostu robi i++).

Musisz być ostrożny podczas aktualizacji tablicy podczas iteracji nad nią.

Możesz iterować tablicę do tyłu w tym przypadku (zacznij na końcu, zrób i--). W zależności od sposobu wdrażania splątów może to być nawet szybsze (potencjalnie mniej elementów tablicy skopiowanych).

6
Thilo 15 sierpień 2014, 00:08

Długość tablicy zmienia się podczas usuwania elementów z niego.

Proponuję użycie array.prototype.filter, aby to osiągnąć (co jest łatwo przesuwany dla IE & LT; = 8):

var arr = [3,45,56,7,88,56,34,345];    
arr = arr.filter( function is_odd(el) { return el % 2; } );
6
Paul 15 sierpień 2014, 00:18

Zapętlasz się przez twoją tablicę przez I, która jest zwiększana za każdym razem. Po dostarzeniu się do 88, rozlicza go, a wciąż zwiększa tablicę, która pominęła przez 56, następna, na którą odnoszę się do 34.

Albo nie musisz przyrostować I, gdy spójście lub, kiedy spójście, po prostu ja ...;

5
RoneRackal 15 sierpień 2014, 00:09
arr.filter(function(item){return item % 2;}));
4
folibis 15 sierpień 2014, 00:19