2009-03-12 9 views
19

Co to najszybszy sposób, aby usunąć jeden konkretny wpis z połowy Array()Najszybszy sposób, aby usunąć jeden wpis z połowy Array()

Array jest duża jedna posiada sznurki.

Nie chcę tylko, aby ustawić tablica [5] = NULL, lecz rozmiar tablicy powinna być zmniejszona o jedną i array [5] powinny mieć zawartość tablicy [6] itp

Odpowiedz

49

nie mają żadnego odniesienia do wspierania tego, ale można by przypuszczać, że rodzimy Array.splice metoda byłaby najszybsza ...

Tak, aby usunąć wpis w indeksie 5:

array.splice(5, 1); 
+0

splice() jest rzeczywiście drogą do zrobienia, ale pamiętaj, że usuwanie elementów w środku będzie powolne z dużymi tablicami, ponieważ flash będzie "przesuwał" kolejne wpisy, aby wypełnić lukę. – grapefrukt

+3

Należy również pamiętać, że usunięcie rzeczy w środku tablicy podczas przeszukiwania spowoduje siać spustoszenie, chyba że będziesz uciekać wstecz. – Sean

+2

Należy zauważyć, że będzie to również działać dla JavaScript. – Grinn

23

Jeśli nie dbasz o kolejność elementów w tablicy (ale po prostu chcesz, aby był krótszy) możesz skopiować ostatni element tablicy do indeksu do usunięcia, a następnie pop ostatni element wyłączony.

array[index] = array[array.length-1]; 
array.pop(); 

Zgaduję, że jest to szybsze, jeśli chodzi o czas pracy procesora, jeśli możesz sobie pozwolić na zmianę kolejności tablic.

EDYCJA: Powinieneś porównać ze swoim konkretnym przypadkiem; Ostatnio to zrobiłem i było to szybsze, niż splatanie. (Prawdopodobnie dlatego, że Chrome nie jest faktycznie przechowywania tablicę jako pojedynczej ciągłej bufora.)

+1

To jest naprawdę sprytne. Rymacznie szybszy niż splice: http: // jsperf.com/remove-element-splice-vs-move-and-pop – MaiaVictor

+0

ostatnia metoda w jsperf powoduje awarię mojej przeglądarki ... – JustGoscha

+1

+1, a co powiesz na jedną linijkę: * array [index] = array.pop() * lub nawet * array [index] = array [array.length-- -1] * –

3

Array.splice()"dodająca elementy i usuwa elementy z tablicy":

myArr.splice(indexToRemove, 1); // only removing one index, thus the 1 
1

W zależności od przypadku, możesz rozważyć użycie Słownika zamiast Tablicy, jeśli chcesz ustawić priorytet wydajności.

var dict:Dictionary = new Dictionary(); 

// The following value/key set should be customized so you can 
// get use of them in your specific case. 

dict[item1] = item1; 
dict[item2] = item2; 

... 

delete dict[item1]; 
2

Przetestowałem Array.prototype.splice() i odkryłem, że jest bardzo wolny na dużych tablicach.

Znacznie szybszym sposobem usuwania elementów jest skopiowanie tych, które chcesz zachować, do nowej tablicy, pomijając te, które chcesz usunąć. Po zakończeniu kopiowania wystarczy zastąpić starą tablicę nową.

W moim teście usunąłem co drugi element z tablicy zawierającej 100 000 elementów. W teście porównano metodę Array.prototype.splice() z innymi metodami. Oto wyniki:

855 ms = splice 
    7 ms = manual copying without preserving the original array 
14 ms = manual copying with preserving the original array 

Oto kod do ostatniej metody:

var arrB = [], 
    i=varA.length, 
    j=0; 

// copy even items to a new array 
while(i > 0) { 
    i-=2; // skip two elements 
    arrB[j++] = arrA[i]; 
} 

// clear the old array 
arrA.splice(0, arrA.length); 

// copy values back to the old array 
// array is preserved (references to the array don't need to be updated) 
arrA.push.apply(arrA, arrB); 

Test w akcji można znaleźć na jsFiddle: http://jsfiddle.net/sansegot/eXvgb/3/

Wyniki są bardzo różne, jeśli masz tylko trzeba usunąć kilka pozycji - w takich przypadkach Array.prototype.splice() jest szybszy (choć różnica nie jest tak duża)! Tylko jeśli musisz wielokrotnie wywoływać splice(), warto wdrożyć niestandardowy algorytm. Drugi test, w którym ograniczona liczba elementów ma zostać usunięta, można znaleźć tutaj: http://jsfiddle.net/sansegot/ZeEFJ/1/

Powiązane problemy