J'essaie de supprimer un élément d'un tableau dans une forEach
boucle, mais j'ai des problèmes avec les solutions standard que j'ai vues.
C'est ce que j'essaye actuellement:
review.forEach(function(p){
if(p === '\u2022 \u2022 \u2022'){
console.log('YippeeeE!!!!!!!!!!!!!!!!')
review.splice(p, 1);
}
});
Je sais qu'il entre dans le if
parce que je vois YippeeeeeE!!!!!!!!!!!!!
dans la console.
MON PROBLÈME: Je sais que ma boucle for et si la logique sont saines, mais ma tentative de supprimer l'élément actuel du tableau échoue.
METTRE À JOUR:
J'ai essayé la réponse de Xotic750 et l'élément n'est toujours pas supprimé:
Voici la fonction dans mon code:
review.forEach(function (item, index, object) {
if (item === '\u2022 \u2022 \u2022') {
console.log('YippeeeE!!!!!!!!!!!!!!!!')
object.splice(index, 1);
}
console.log('[' + item + ']');
});
Voici la sortie où le tableau n'est toujours pas supprimé:
[Scott McNeil]
[reviewed 4 months ago]
[ Mitsubishi is AMAZING!!!]
YippeeeE!!!!!!!!!!!!!!!!
[• • •]
Donc, évidemment, il entre dans l'instruction if comme indiqué, mais il est également évident que le [• • •] est toujours là.
javascript
foreach
novicePrgrmr
la source
la source
forEach
? Si vous souhaitez supprimer des éléments, la fonction la plus appropriée estfilter
.index
attribut plutôt queitem
pour votresplice
Réponses:
On dirait que vous essayez de faire ça?
Itérer et muter un tableau à l'aide de Array.prototype.splice
Ce qui fonctionne bien pour un cas simple où vous n'avez pas 2 des mêmes valeurs que les éléments de tableau adjacents, sinon vous avez ce problème.
Alors, que pouvons-nous faire pour résoudre ce problème lors de l'itération et de la mutation d'un tableau? Eh bien, la solution habituelle est de travailler en sens inverse. Utiliser ES3 pendant mais vous pouvez l'utiliser pour le sucre si vous préférez
Ok, mais vous vouliez utiliser les méthodes d'itération ES5. Eh bien, l'option serait d'utiliser Array.prototype.filter mais cela ne mute pas le tableau d'origine mais en crée un nouveau, donc même si vous pouvez obtenir la bonne réponse, ce n'est pas ce que vous semblez avoir spécifié.
Nous pourrions également utiliser ES5 Array.prototype.reduceRight , pas pour sa propriété réductrice par sa propriété d'itération, c'est-à-dire itérer en sens inverse.
Ou nous pourrions utiliser ES5 Array.protoype.indexOf comme ça.
Mais vous souhaitez spécifiquement utiliser ES5 Array.prototype.forEach , alors que pouvons-nous faire? Eh bien, nous devons utiliser Array.prototype.slice pour faire une copie superficielle du tableau et Array.prototype.reverse afin que nous puissions travailler en sens inverse pour muter le tableau d'origine.
Enfin, ES6 nous offre d'autres alternatives, où nous n'avons pas besoin de faire des copies superficielles et de les inverser. Notamment, nous pouvons utiliser des générateurs et des itérateurs . Cependant, le soutien est actuellement assez faible.
Quelque chose à noter dans tout ce qui précède est que, si vous supprimiez NaN du tableau, la comparaison avec des égaux ne fonctionnera pas car en Javascript
NaN === NaN
est faux. Mais nous allons ignorer cela dans les solutions car il s'agit d'un autre cas de bord non spécifié.Alors voilà, une réponse plus complète avec des solutions qui ont encore des cas extrêmes. Le tout premier exemple de code est toujours correct, mais comme indiqué, ce n'est pas sans problèmes.
la source
console.log(review);
après leforEach
, comme dans mon exemple.Utilisez à la
Array.prototype.filter
place deforEach
:la source
Bien que la réponse de Xotic750 fournisse plusieurs bons points et des solutions possibles, la simplicité est parfois préférable .
Vous savez que le tableau en cours d'itération est en cours de mutation dans l'itération elle-même (c'est-à-dire en supprimant un élément => les changements d'index), donc la logique la plus simple est de revenir en arrière à l'ancienne
for
(à la langue C ):Si vous y réfléchissez vraiment, a
forEach
n'est que du sucre syntaxique pour unefor
boucle ... Donc, si cela ne vous aide pas, arrêtez de vous casser la tête contre cela.la source
Vous pouvez également utiliser indexOf à la place pour ce faire
la source
J'ai compris que vous souhaitiez supprimer du tableau en utilisant une condition et avoir un autre tableau dont les éléments ont été supprimés du tableau. Est correct?
Que dis-tu de ça?
J'espère que cette aide ...
Au fait, j'ai comparé «for-loop» à «forEach».
Si remove au cas où une chaîne contient «f», le résultat est différent.
Et supprimer à chaque itération, aussi un résultat est différent.
la source
Ce qui suit vous donnera tous les éléments qui ne sont pas égaux à vos caractères spéciaux!
la source
Voici comment procéder:
la source
if
instruction.item, index, object