2015-12-19 12 views
10

Mam dwie identyczne tablice: itemsOutput & itemsOutput2Usuń obiekty z tablicy - dwa różne podejścia, dwa różne wyniki podczas konsultacji długość każdej tablicy

chcę usunąć te obiekty w tablicach z attributes.type = "DIMENSION". Znalazłem dwa różne sposoby robi tak:

Metoda 1

jQuery.each(itemsOutput, function(i, val) { 
    if(val.attributes.type == "DIMENSION") // delete index 
     { 
     delete itemsOutput[i]; 
     } 
}); 
console.log(itemsOutput.length); 

Metoda 2

metrics = itemsOutput2.filter(function (el) { 
      return el.attributes.type === "METRIC"; 
      }); 
console.log(metrics.length); 

Chociaż oba nowe tablice wydają się mieć taką samą liczbę obiektów (i w obu przypadkach zniknęły wszystkie obiekty o atrybut.type = "DIMENSION"), konsola pokazuje dwie całkowicie różne wartości długości każdej z tablic.

Metoda 1 usuwa przedmioty, a długość jest taka sama jak w oryginalnej matrycy (chociaż odkrywania tablicy w konsoli I zauważyć, że obiekty zachować oryginalne indeksy)

Metoda 2 nie tylko usuwa przedmioty, ale także sukcesywnie gromadzi indeksy. Dla mnie kod wydaje się bardziej przejrzysty, więc pozostanę przy tej metodzie.

Moje pytanie brzmi, dlaczego tak się dzieje i czy mogą wystąpić problemy, jeśli na przykład korzystam z wyników metody 1 w pętli.

Odpowiedz

6

Po usunięciu elementu tablicy the array length is not affected. Zachowuje się to nawet po usunięciu ostatniego elementu tablicy. Kiedy operator delete usuwa element tablicy, ten element nie jest już w tablicy, ale jego długość pozostaje taka sama.

Musisz użyć metody splice, jeśli chcesz usunąć ją z tablicy. Na przykład:

itemsOutput.splice(i, 1); 
+0

Nie wiem, jak działa jQuery.each, ale ... Jeśli pętle nad obiektami zaczyna się od początku, może spowodować błędy, jeśli zaczniesz używać splice w środkowej pętli tablicy. – Marie

+0

* tablica będzie zawierać niezdefiniowaną wartość w tym indeksie *? Nie całkiem. – DavidDomain

+0

Przynajmniej w firefoxie wygląda na to, że to prawda @DavidDormain. Otworzyłem konsolę i uruchomiłem następujące polecenia ... 'var test = [1, 2, 3, 4];', 'delete test [2];' wydruki testowe 'Array [1, 2, <1 empty slot> , 4] ', następnie' test [2] === undefined 'prints' true' – Marie

Powiązane problemy