Ich versuche, ein Element in einem Array in einer forEach
Schleife zu entfernen , habe jedoch Probleme mit den Standardlösungen, die ich gesehen habe.
Folgendes versuche ich gerade:
review.forEach(function(p){
if(p === '\u2022 \u2022 \u2022'){
console.log('YippeeeE!!!!!!!!!!!!!!!!')
review.splice(p, 1);
}
});
Ich weiß, dass es in die geht, if
weil ich YippeeeeeE!!!!!!!!!!!!!
in der Konsole sehe .
MEIN PROBLEM: Ich weiß, dass meine for-Schleife und die Logik einwandfrei sind, aber mein Versuch, das aktuelle Element aus dem Array zu entfernen, schlägt fehl.
AKTUALISIEREN:
Versuchte die Antwort von Xotic750 und das Element wird immer noch nicht entfernt:
Hier ist die Funktion in meinem Code:
review.forEach(function (item, index, object) {
if (item === '\u2022 \u2022 \u2022') {
console.log('YippeeeE!!!!!!!!!!!!!!!!')
object.splice(index, 1);
}
console.log('[' + item + ']');
});
Hier ist die Ausgabe, bei der das Array noch nicht entfernt wird:
[Scott McNeil]
[reviewed 4 months ago]
[ Mitsubishi is AMAZING!!!]
YippeeeE!!!!!!!!!!!!!!!!
[• • •]
Es geht also offensichtlich wie angegeben in die if-Anweisung ein, aber es ist auch offensichtlich, dass das [• • •] noch vorhanden ist.
quelle
forEach
? Wenn Sie Elemente entfernen möchten, ist die am besten geeignete Funktionfilter
.index
Attribut verwenden sollten, anstattitem
für Ihresplice
Antworten:
Sieht so aus, als würden Sie das versuchen?
Iterieren und mutieren Sie ein Array mit Array.prototype.splice
Dies funktioniert gut für einfache Fälle, in denen Sie nicht zwei gleiche Werte wie benachbarte Array-Elemente haben. Andernfalls tritt dieses Problem auf.
Was können wir also gegen dieses Problem tun, wenn wir ein Array iterieren und mutieren? Nun, die übliche Lösung ist, umgekehrt zu arbeiten. Verwenden Sie ES3 zwar, aber Sie können es auch für Zucker verwenden, wenn Sie dies bevorzugen
Ok, aber Sie wollten, dass Sie ES5-Iterationsmethoden verwenden. Nun und Option wäre die Verwendung von Array.prototype.filter, aber dies mutiert nicht das ursprüngliche Array, sondern erstellt ein neues. Obwohl Sie die richtige Antwort erhalten können, ist es nicht das, was Sie anscheinend angegeben haben.
Wir könnten auch ES5 Array.prototype.reduceRight verwenden , nicht wegen seiner reduzierenden Eigenschaft durch seine Iterationseigenschaft, dh umgekehrt iterieren.
Oder wir könnten ES5 Array.protoype.indexOf so verwenden.
Sie möchten jedoch speziell ES5 Array.prototype.forEach verwenden . Was können wir also tun? Nun, wir müssen Array.prototype.slice verwenden , um eine flache Kopie des Arrays und Array.prototype.reverse zu erstellen, damit wir umgekehrt arbeiten können, um das ursprüngliche Array zu mutieren.
Schließlich bietet uns ES6 einige weitere Alternativen, bei denen wir keine flachen Kopien erstellen und diese umkehren müssen. Insbesondere können wir Generatoren und Iteratoren verwenden . Die Unterstützung ist derzeit jedoch relativ gering.
In all dem ist etwas zu beachten, wenn Sie NaN gestrippt haben Vergleich mit Gleichheit nicht funktioniert aus dem Array entfernt haben, da dies in Javascript
NaN === NaN
falsch ist. Aber wir werden das in den Lösungen ignorieren, da es sich um einen weiteren nicht näher bezeichneten Randfall handelt.Da haben wir es also, eine vollständigere Antwort mit Lösungen, die noch Randfälle haben. Das allererste Codebeispiel ist immer noch korrekt, aber wie gesagt, es ist nicht ohne Probleme.
quelle
console.log(review);
nach demforEach
, wie in meinem Beispiel.Verwenden Sie
Array.prototype.filter
anstelle vonforEach
:quelle
Obwohl die Antwort von Xotic750 mehrere gute Punkte und mögliche Lösungen bietet, ist manchmal einfach besser .
Sie wissen, dass das Array, auf dem iteriert wird, in der Iteration selbst mutiert wird (dh Entfernen eines Elements => Indexänderungen). Daher ist es am einfachsten, in einer altmodischen Sprache
for
(à la C ) rückwärts zu gehen :Wenn Sie wirklich darüber nachdenken,
forEach
ist a nur syntaktischer Zucker für einefor
Schleife ... Wenn es Ihnen also nicht hilft, hören Sie bitte auf, sich den Kopf dagegen zu brechen.quelle
Sie können dazu auch indexOf verwenden
quelle
Ich habe verstanden, dass Sie mithilfe einer Bedingung aus dem Array entfernen möchten und ein anderes Array haben möchten, dessen Elemente aus dem Array entfernt wurden. Ist richtig?
Wie wäre es damit?
Ich hoffe das hilft...
Übrigens habe ich 'for-loop' mit 'forEach' verglichen.
Wenn entfernen, falls eine Zeichenfolge 'f' enthält, ist das Ergebnis anders.
Und entfernen Sie durch jede Iteration, auch ein Ergebnis ist anders.
quelle
Im Folgenden finden Sie alle Elemente, die nicht Ihren Sonderzeichen entsprechen!
quelle
So sollten Sie es machen:
quelle
if
Anweisung.item, index, object
Das Problem ist, dass beim Spleißen eines Arrays offensichtlich die Schlüssel oder Indizes der Werte geändert werden. Wenn Sie also die Nadel nacheinander auf "true" treffen, können Sie den nächsten Wert im Stapel übersehen.
Um dem entgegenzuwirken, können Sie Folgendes tun:
quelle