L'épissage d'un tableau Javascript à partir de dans le callback passé à forEach
J'ai ce code qui est censé pour itérer sur chaque élément dans un tableau, de la suppression d'éléments basée sur une condition:
//iterate over all items in an array
//if the item is "b", remove it.
var array = ["a", "b", "c"];
array.forEach(function(item) {
if(item === "b") {
array.splice(array.indexOf(item), 1);
}
console.log(item);
});
De sortie souhaité:
a
b
c
De sortie réelle:
a
b
Évidemment, le natif forEach méthode n'est pas vérifier après chaque itération si l'élément a été supprimé, donc si c'est pour le prochain élément est ignoré. Est-il une meilleure façon de le faire, en dehors de substitution de la méthode forEach ou mettre mon propre classe à utiliser au lieu d'un tableau?
Modifier - pour faire suite à mon commentaire, je suppose que la solution est de simplement utiliser un standard pour la boucle. Hésitez pas à répondre si vous avez une meilleure façon.
OriginalL'auteur Gus Hogg-Blake | 2014-02-16
Vous devez vous connecter pour publier un commentaire.
Permet de voir pourquoi JavaScript se comporte comme cela. Selon le ECMAScript spécification standard pour
Array.le prototype.forEach
,lorsque vous supprimez un élément à l'index 1, l'élément à l'index 2 devient l'élément à l'index 1 index et 2 n'existe pas pour cet objet.
Maintenant, JavaScript semble pour l'élément 2 dans l'objet, qui n'est pas trouvé, donc il ignore l'appel de la fonction.
C'est pourquoi vous ne voyez que
a
etb
.La réelle manière de faire ceci est d'utiliser
Array.le prototype.filtre
reduce
.? vous ne pouvez pas connecter rien à la console après un
return
déclarationNon, vous ne pouvez pas.
c'est mon point de vue. Dans l'exemple ci-dessus, il y a un enregistrement de l'instruction après le retour.
oh, ok, désolé, j'étais pressé et n'avez pas remarqué que vous ne vous posez pas une question, mon mauvais.
OriginalL'auteur thefourtheye
Une possibilité serait d'utiliser la
array.slice(0)
fonction, ce qui crée une copie (clone) de la matrice et donc l'itération est séparé de la suppression.Alors le seul changement à l'approche originale à l'aide de
array.forEach
serait à changer pourarray.slice(0).forEach
et cela fonctionne:Après le forEach, le tableau contient uniquement
a
etb
.Un jsFiddle démo peut être trouvée ici.
_.clone(array).forEach(function (item) { ... })
OriginalL'auteur pasty
Tous les mentionnés ci-dessus répond simplement de ne pas ou de ne pas conserver l'original du tableau pour être passé d'ailleurs, si nous devions retirer les deux éléments à un index spécifique et continuer de l'itération de l'immédiat élément.
pour le supposez, j'ai un tableau
Je veux épissure deux éléments si il ya successives combinaison de ford et chevrolet.
Ainsi, de cette façon je suis le remplaçant le couple épissé éléments avec une valeur null pour que je puisse l'adapter à la non mise à jour des index d'itération de la boucle forEach(). Ensuite, je peux nettoyer le tableau de toute insérés les valeurs null une fois l'itération est terminée, et le tableau est prêt à être transmis.
Ce peut être un meilleur moyen de ne pas entraver quoi que ce soit et absoloutely la résolution de ce sinistre comportement de javascript.
OriginalL'auteur mr.G
Une autre possibilité serait d'utiliser la
array.reduceRight
fonction pour éviter l'ignorer:Après la
reduceRight
, le tableau contient uniquementa
etc
.OriginalL'auteur Elvinn