2009-03-12 8 views

Respuesta

49

no tienen ningún puntos de referencia para apoyar esto, pero es de suponer que el método nativo Array.splice sería el más rápido ...

por lo tanto, para eliminar la entrada en el índice 5:

array.splice(5, 1); 
+0

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

+3

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

+2

Tenga en cuenta que esto también funcionará para JavaScript. – Grinn

23

Si no lo hace se preocupa por el orden de los elementos en la matriz (pero solo quiere que sea 1 más corto) puede copiar el último elemento de la matriz en el índice que se va a eliminar, luego pop el último elemento desactivado.

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

yo supongo que es más rápido, CPU-en cuanto a tiempo, si puede salirse con la reordenación de la matriz.

EDITAR: Debe realizar una evaluación comparativa para su caso específico; Hace poco hice esto y fue más rápido empalmarme. (Presumiblemente debido a Chrome en realidad no se almacena la matriz como una sola memoria intermedia continua.)

+1

Eso es realmente inteligente. Ridículamente más rápido que empalme: http: // jsperf.com/remove-element-splice-vs-move-and-pop – MaiaVictor

+0

el último método en el jsperf bloquea mi navegador ... – JustGoscha

+1

+1, qué tal un trazador de líneas: * array [index] = array.pop() * o incluso * array [index] = array [array.length-- -1] * –

3

Array.splice()"añade elementos a y elimina elementos de una matriz":

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

Dependiendo de su caso, puede considerar usar un diccionario en lugar de una matriz si desea priorizar el rendimiento.

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

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/

Cuestiones relacionadas