2009-03-12 8 views

Répondre

49

Ne pas avoir des points de repère pour soutenir, mais on peut supposer que la méthode Array.splice native serait le plus rapide ...

donc, pour supprimer l'entrée à l'index 5:

array.splice(5, 1); 
+0

splice() est en effet le chemin à parcourir, mais gardez à l'esprit que la suppression de choses au milieu sera lente avec de grands tableaux puisque flash va "remonter" les entrées suivantes pour combler le vide. – grapefrukt

+3

Gardez également à l'esprit que le fait de supprimer des éléments au milieu d'un tableau tout en l'exécutant causera des ravages à moins que vous ne couriez en arrière. – Sean

+2

Notez que cela fonctionnera aussi pour JavaScript. – Grinn

23

Si vous n'êtes pas attention à l'ordre des éléments dans le tableau (mais je veux juste qu'il soit plus court 1), vous pouvez copier le dernier élément du tableau à l'index à supprimer, puis pop le dernier élément off.

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

Je suppose que cela est si vous pouvez vous en sortir avec réorganisant le tableau plus rapide, sage CPU-temps,.

EDIT: Vous devriez référencer votre cas spécifique; J'ai récemment fait cela, et il était plus rapide de simplement épisser. (Probablement parce que Chrome ne stocke pas réellement le tableau comme un tampon en continu.)

+1

C'est vraiment intelligent. Ridiculement plus rapide que l'épissage: http: // jsperf.com/remove-élément-splice-vs-déplacer-et-pop – MaiaVictor

+0

la dernière méthode dans le jsperf bloque mon navigateur ... – JustGoscha

+1

+1, que diriez-vous d'un one-liner: * array [index] = array.pop() * ou pair * array [index] = array [array.length-- -1] * –

3

Array.splice()"ajoute des éléments et supprime les éléments d'un tableau":

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

Selon votre cas, vous pouvez envisager d'utiliser un dictionnaire à la place d'un tableau si vous souhaitez hiérarchiser les performances.

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

J'ai testé Array.prototype.splice() et trouvé que c'est très lent sur les grands tableaux.

Une manière beaucoup plus rapide de supprimer des éléments consiste à copier ceux que vous souhaitez conserver dans un nouveau tableau, tout en ignorant ceux que vous voulez supprimer. Une fois la copie terminée, vous remplacez simplement l'ancien tableau par le nouveau.

Dans mon test, j'ai supprimé tous les autres éléments d'un tableau contenant 100 000 éléments. Le test a comparé Array.prototype.splice() à d'autres méthodes. Voici les résultats:

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

Voici le code pour la dernière méthode:

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); 

Le test en action se trouve sur jsFiddle: http://jsfiddle.net/sansegot/eXvgb/3/

Les résultats sont bien différents si vous ne besoin de supprimer quelques éléments - dans ce cas Array.prototype.splice() est plus rapide (bien que la différence ne soit pas si grande)! Seulement si vous devez appeler splice() plusieurs fois cela vaut la peine d'implémenter un algorithme personnalisé. Le deuxième test, dans lequel un nombre limité d'éléments doivent être supprimés peut être trouvé ici: http://jsfiddle.net/sansegot/ZeEFJ/1/

Questions connexes