2009-09-25 17 views
13

Piszę aplikację w Flex/ActionScript i mam kilka zmiennych składowych klasy typu Array przechowujących dane.Najlepszy sposób na usunięcie wszystkich elementów z tablicy ActionScript?

Moje pytanie brzmi: jaki jest "najlepszy" sposób na wyczyszczenie obiektu Array?

Zauważyłem, że klasa ArrayCollection ma funkcję removeAll(), która to robi, ale podstawowa klasa Array tego nie robi. Niektóre możliwości jakie uważane są:

  • Iterując tablicy, nazywając pop lub przesunąć na każdym elemencie
  • Ustawianie długości tablicy do 0
  • Ustawianie zmiennej członka do „new Array()” lub "[]"

Odpowiedz

15

powiedziałbym:

myArray = [ ]; 

to wyraźne, krótkie i dobrze wykorzystuje śmieci VM za kolekcjoner.

Twoja pierwsza alternatywa uruchamia wiele zinterpretowanych kodów, aby uzyskać taki sam wynik.

Nie wiem, że drugi robi to, co chcesz; jeśli tak, to jest hacky, niejasne.

Wariant "nowa tablica()" trzeciej alternatywy jest po prostu rozwlekły, nie oferując żadnej przewagi nad literałem tablicowym. Jeśli również napiszesz JS i użyjesz JSLint, zostaniesz przekrzyczany, ponieważ nie używasz literalnej formy tablicy.

+3

Ustaw długość = 0 nie jest hacky jak oficjalna as3 lang ref wspomniano: http://help.adobe.com/en_US/AS3LCR/Flash_10.0/Array.html#length. Ja osobiście używam tej metody. Zgadzam się z Christopherem W. Allenem-Poole'em, że twoja metoda nie oczyszcza tablicy. –

+0

myArray.length = 0 jest bardziej niejasne w tym sensie, że wprowadza niepotrzebnie opisowy element tablicy, kiedy wszystko, co powinno zostać przekazane do czytnika, to "usuń tablicę". Funkcja obcinania ustawiającego długość początkowo uderzyła mnie jako dodatkowy bonus. W każdym razie reakcja Christophera W. Allena-Poole'a (cwallenpoole) ma wiele sensu i wydaje się nieco bardziej widoczna, ponieważ operacja "splicingu" jest bardziej dosłowna i została zaprojektowana specjalnie do * usuwania * elementów. – Pup

8

To zależy od kontekstu. Podczas korzystania odpowiedź pana Younga jest często najbardziej poprawny sposób robienia rzeczy, nie zawsze będzie działać, zwłaszcza jeśli masz dwie zmienne wskazujące na tej samej tablicy:

var foo:Array 
var bar:Array 
foo = bar = [ 1, 2, 3 ]; 
bar = []; 
trace(foo); // 1,2,3 

Z drugiej strony, jeśli rzeczywiście pusty tablica ręcznie:

var foo:Array 
var bar:Array 
foo = bar = [ 1, 2, 3 ]; 
var l:int = bar.length; // get the length FIRST! 
         // Otherwise bar.length will change 
         // while you iterate! 

for(var i:int = 0; i < l; i++) 
{ 
    bar.shift(); 
} 
trace(foo); // does not trace anything 
+1

while (bar.length> 0) bar.shift(); // :) –

+5

bar.splice (0); // Brak pętli :) –

7

Jeśli można zmodyfikować nazwę tablicy, a potem pójdzie z odpowiedzią Warrena. Jeśli trzeba zmodyfikować istniejącą instancję, można również użyć Array.splice:

var arr : Array = [1, 2, 3, 4, 5]; 

arr.splice(0, arr.length); 
+1

arr.splice (0); lub lepiej: arr.length = 0; –

14

boję się powiedzieć, ale Warren Young jest źle, kiedy powiedział, że ustawienie myArray = [] powoduje garbage collector, aby podnieść tablica.

ponieważ masz możliwość dodania do siebie odniesienia w sobie, a zatem nigdy nie byłaby ona gromadzona i wykorzystywała pamięć, szczególnie jeśli tablica ma kilka Sprites w tablicy, ponieważ one również miałyby odniesienie do nich i oni też nigdy nie zostaną zebrani.

Sly_cardinal i Richard Szalay mają 100% poprawności. ale parametr długości nie jest potrzebny u Richarda.

Aby całkowicie jasne, tablica i upewnij się, że jego zbierane przez śmieci następnie

myArray.splice(0); 
myArray = null; 
1

Według this testnajlepiej sposobem jest ustawienie długość = 0

Powiązane problemy