Tableau Javascript Épissure ne fonctionne Pas bien
var cache = [];
cache[0] = "0";
cache[1] = "1";
cache[2] = "2";
cache[3] = "3";
cache[4] = "4";
cache["r"] = "r";
console.log(cache.length);
for(key in cache){
if(isNaN(key))continue;
else cache.splice(key,1); //cache.splice(key) is working fine, ***
}
console.log(cache);
Question : en ligne ***
Pourquoi splice(clé) fonctionne bien (Suppression de Tous les Éléments avec Index Numérique) et splice(clé 1) ne fonctionne pas bien (Pas de Suppression d'Éléments avec index Numérique). J'ai même essayé
splice(key,1) //Not working as splice(key)
splice(key--,1) //Even not working as splice(key)
splice(key,0) //not deleting any thing
Vous pouvez copier et coller le code dans la console de Firebug pour les tests.
- Pouvez-vous préciser "pas de travail"? Ce qui se passe quand vous essayez de le code, et comment est-il différent de ce que vous attendez? Avez-vous un message d'erreur?
- splice fonction supprimer l'élément de la matrice. Ses faut supprimer tout élément ayant un indice numérique, mais son retrait de quelques un
- afin d'épissage attend de me donner un indice numérique, so (n,x) signifie démarrer à partir d'index numérique n et supprimer les valeurs de x après l'indice n. si n n'est pas numérique, mais alors pas nécessaire de x. De sorte qu'il fonctionne bien x est supprimé.
- Non, il ne fonctionne pas sans un index. Si vous ne spécifiez un paramètre, qui est utilisé comme indice, et il va supprimer tous les éléments à la fin du tableau. Si vous utilisez la méthode avec une clé au lieu d'un indice et il semble fonctionner, c'est juste une coïncidence, car les valeurs que vous avez utilisé qui est arrivé à donner le même résultat.
Vous devez vous connecter pour publier un commentaire.
Il ne fonctionne pas parce que vous êtes en train de supprimer des éléments de la matrice de pr en boucle par les clés. Lorsque vous supprimez un élément, il permet de réorganiser les autres éléments en fonction de la façon dont le tableau est mis en œuvre en interne, et vous vous retrouvez avec une boucle qui n'a pas d'itérer sur les touches que vous attendez.
Quand je l'ai essayer dans Firefox, il ne itère sur les touches
0
,1
,2
etr
. Suppression d'éléments lors de l'itération fait sauter3
et4
. Lesplice
lui-même fonctionne très bien, mais il affecte la boucle, de sorte que certains éléments sont tout simplement pas dans l'itération.Que vous sont actuellement à la recherche d'indices dans le tableau en sautant les non-touches numériques, vous pouvez simplement faire une boucle sur les indices de la place. Par boucle à travers eux vers l'arrière, vous n'obtenez pas le problème avec le tableau de changer alors que vous parcourez c':
Démo: http://jsfiddle.net/CguTp/1/
splice(key)
ne fonctionne pas, il ne donne le même résultat dans le cas présent, que le code de la tentative de suppression de tous les éléments. Il va supprimer tous les éléments de la matrice dans la première itération, il ne sera pas supprimer un élément à la fois.1)
cache["r"] = "r";
ne pas ajouter un élément à votre tableau, il ajoute une propriété de l'objet dans le cachePour initialiser un tableau, vous pouvez utiliser quelque chose comme
ou
Depuis votre objet cache n'est pas un tableau, vous ne pouvez pas attendre d'épissure de se comporter comme il le ferait pour un tableau.
2) splice s'attend à un indice comme le premier argument, n'est pas une clé
voir http://www.w3schools.com/jsref/jsref_splice.asp
De sorte que vous pouvez l'utiliser pour supprimer toutes les valeurs numériques:
cache
n'est pas un tableau, vous ne pouvez pas attendre d'épissure de se comporter comme il est.cache
objet est un objet JSON, pas un tableauÉpissure s'attend à ce premier indice numérique,
Il va commencer à supprimer les valeurs du tableau commençant à l'indice n et supprimer les valeurs de x après l'indice n.
Maintenant
if n is not numeric but a key
alors pas besoin de x, car x peut déplacer le pointeur vers l'avant dans unnumeric-indexed array
seulement pas de tableau associatif. Donc supprimer x de splice(n,x) fera fonction similaire à splice(clé) etc etc il fonctionne parfaitement.delete
de travail, comme dans cet exemple (bien que le.length
propriété semble fonctionner anormalement).