Probé Array.prototype.splice() y encontré que es muy lento en arreglos grandes.
Una manera mucho más rápida de la eliminación de elementos es copiar los que desea mantener a una nueva matriz, mientras que saltarse las que desee eliminar. Una vez que haya terminado de copiar, simplemente anule la matriz anterior con la nueva.
En mi prueba me eliminado todos los demás elementos de una matriz que contiene 100.000 artículos. La prueba comparó Array.prototype.splice() con otros métodos. Aquí están los resultados:
855 ms = splice
7 ms = manual copying without preserving the original array
14 ms = manual copying with preserving the original array
Aquí está el código para el último método:
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);
La prueba en la acción se puede encontrar en jsFiddle: http://jsfiddle.net/sansegot/eXvgb/3/
Los resultados son muy diferentes si sólo se necesita eliminar algunos elementos; en tales casos, Array.prototype.splice() es más rápido (¡aunque la diferencia no es tan grande)! Solo si necesita llamar a empalme() muchas veces, vale la pena implementar un algoritmo personalizado. La segunda prueba, en la que se debe eliminar un número limitado de elementos, se puede encontrar aquí: http://jsfiddle.net/sansegot/ZeEFJ/1/
empalme() es realmente el camino a seguir, pero tenga en cuenta que la eliminación de cosas en el medio será lenta con arreglos grandes ya que el flash "subirá" las entradas posteriores para llenar el espacio. – grapefrukt
También tenga en cuenta que quitar cosas en el medio de una matriz mientras lo ejecuta causará estragos a menos que esté retrocediendo. – Sean
Tenga en cuenta que esto también funcionará para JavaScript. – Grinn