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/
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
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
Należy zauważyć, że będzie to również działać dla JavaScript. – Grinn