Próbuję usunąć element z tablicy w pliku forEach
pętli, ale mam problemy ze standardowymi rozwiązaniami, które widziałem.
Oto, czego obecnie próbuję:
review.forEach(function(p){
if(p === '\u2022 \u2022 \u2022'){
console.log('YippeeeE!!!!!!!!!!!!!!!!')
review.splice(p, 1);
}
});
Wiem, że wchodzi w to, if
ponieważ widzę YippeeeeeE!!!!!!!!!!!!!
w konsoli.
MÓJ PROBLEM: Wiem, że moja pętla for i logika są prawidłowe, ale moja próba usunięcia bieżącego elementu z tablicy kończy się niepowodzeniem.
AKTUALIZACJA:
Wypróbowałem odpowiedź Xotic750, a element nadal nie jest usuwany:
Oto funkcja w moim kodzie:
review.forEach(function (item, index, object) {
if (item === '\u2022 \u2022 \u2022') {
console.log('YippeeeE!!!!!!!!!!!!!!!!')
object.splice(index, 1);
}
console.log('[' + item + ']');
});
Oto dane wyjściowe, w których tablica nadal nie jest usuwana:
[Scott McNeil]
[reviewed 4 months ago]
[ Mitsubishi is AMAZING!!!]
YippeeeE!!!!!!!!!!!!!!!!
[• • •]
Więc oczywiście wchodzi w instrukcję if zgodnie z zaleceniami, ale jest również oczywiste, że [• • •] wciąż tam jest.
javascript
foreach
nowicjuszPrgrmr
źródło
źródło
forEach
? Jeśli chcesz usunąć elementy, najbardziej odpowiednią funkcją jestfilter
.index
atrybutu, a nieitem
swojegosplice
Odpowiedzi:
Wygląda na to, że próbujesz to zrobić?
Wykonaj iterację i mutuj tablicę za pomocą Array.prototype.splice
Co działa dobrze w prostym przypadku, gdy nie masz 2 takich samych wartości jak sąsiednie elementy tablicy, w przeciwnym razie masz ten problem.
Więc co możemy zrobić z tym problemem podczas iteracji i mutacji tablicy? Cóż, zwykłym rozwiązaniem jest praca w odwrotnej kolejności. Używasz ES3 , ale możesz użyć do cukru, jeśli wolisz
Ok, ale chciałeś użyć metod iteracji ES5. Cóż, opcją byłoby użycie Array.prototype.filter, ale to nie zmienia oryginalnej tablicy, ale tworzy nową, więc chociaż możesz uzyskać poprawną odpowiedź, nie jest to to, co wydaje się być określone.
Moglibyśmy również użyć ES5 Array.prototype.reduceRight , nie dla jego właściwości redukującej, a raczej jej właściwości iteracji, tj. Iteracji w odwrotnej kolejności.
Lub możemy użyć ES5 Array.protoype.indexOf w ten sposób.
Ale konkretnie chcesz użyć ES5 Array.prototype.forEach , więc co możemy zrobić? Cóż, musimy użyć Array.prototype.slice, aby utworzyć płytką kopię tablicy i Array.prototype.reverse , abyśmy mogli pracować w odwrotnej kolejności, aby zmutować oryginalną tablicę.
Wreszcie ES6 oferuje nam dalsze alternatywy, w przypadku których nie musimy wykonywać płytkich kopii i odwracać ich. W szczególności możemy używać generatorów i iteratorów . Jednak obecnie poparcie jest dość niskie.
Coś, na co należy zwrócić uwagę w powyższym, polega na tym, że jeśli usuwałeś NaN z tablicy, porównywanie z równymi sobie nie zadziała, ponieważ w Javascript
NaN === NaN
jest fałszywe. Ale zamierzamy zignorować to w rozwiązaniach, ponieważ jest to kolejny nieokreślony przypadek skrajny.Mamy więc pełniejszą odpowiedź z rozwiązaniami, które wciąż mają skrajne przypadki. Pierwszy przykład kodu jest nadal poprawny, ale jak wspomniano, nie jest pozbawiony problemów.
źródło
console.log(review);
poforEach
, jak w moim przykładzie.Użyj
Array.prototype.filter
zamiastforEach
:źródło
Mimo że odpowiedź Xotic750 zawiera kilka dobrych punktów i możliwych rozwiązań, czasami proste jest lepsze .
Wiesz, że tablica, na której jest iterowana, jest mutowana w samej iteracji (tj. Usuwaniu elementu => zmiany indeksu), dlatego najprostszą logiką jest cofnięcie się w staroświeckim
for
(języku à la C ):Jeśli naprawdę o tym myślisz, to
forEach
jest po prostu cukier syntaktyczny dlafor
pętli ... Więc jeśli ci to nie pomaga, po prostu przestań łamać sobie głowę przeciwko temu.źródło
Aby to zrobić, możesz również użyć indexOf
źródło
Zrozumiałem, że chcesz usunąć z tablicy przy użyciu warunku i mieć inną tablicę, która ma usunięte elementy z tablicy. Jest w porządku?
Co powiesz na to?
Mam nadzieję, że to pomoże...
Przy okazji porównałem „for-loop” z „forEach”.
Jeśli usuniesz w przypadku, gdy ciąg zawiera „f”, wynik jest inny.
I usuń po każdej iteracji, również wynik jest inny.
źródło
Poniżej znajdziesz wszystkie elementy, które nie są równe twoim znakom specjalnym!
źródło
Oto jak powinieneś to zrobić:
źródło
if
instrukcji.item, index, object