[1,2,3].forEach(function(el) {
if(el === 1) break;
});
Jak mogę to zrobić za pomocą nowej forEach
metody w JavaScript? Próbowałem return;
, return false;
i break
.break
ulega awarii i return
nie wykonuje nic poza kontynuowaniem iteracji.
javascript
arrays
Scott Klarenbach
źródło
źródło
return
rzeczywiście kontynuuje iterację, pominie każdy kod, który pojawi się po nim w bloku. Weźmy na przykład ten kod[1,2,3].forEach(function(el) { if(el === 2) { console.log(`Match on 2!`); return; } console.log(el); });
:.console.log(el);
Zostaną one pominięte, gdy 2 zostaną dopasowane.Odpowiedzi:
Nie ma wbudowanego zdolności
break
wforEach
. Aby przerwać wykonywanie, musisz rzucić jakiś wyjątek. na przykład.Wyjątki JavaScript nie są strasznie ładne. Tradycyjna
for
pętla może być bardziej odpowiednia, jeśli naprawdę potrzebujeszbreak
w niej wejść .Posługiwać się
Array#some
Zamiast tego użyj
Array#some
:Działa to, ponieważ
some
zwracatrue
jak najszybciej jakikolwiek callback, wykonywany w kolejności tablicowej, returntrue
, zwiera wykonanie reszty.some
, jego odwrotnośćevery
(która zatrzyma się na areturn false
) iforEach
wszystkie metody ECMAScript Piątej Edycji, które trzeba będzie dodać doArray.prototype
przeglądarek, w których ich brakuje.źródło
some
a odpowiedźevery
powinna znajdować się na GÓRZE. Nie mogę zrozumieć, dlaczego ludzie uważają, że jest mniej czytelny. To jest po prostu niesamowite!Array#some
jest naprawdę miłe. Po pierwsze, jest kompatybilny z większością przeglądarek, w tym ie9 i Firefox 1.5. Moim przykładowym przypadkiem użycia będzie znalezienie indeksu w tablicy zakresów [a, b], gdzie liczba znajduje się między dolną granicą a górną parą granic, przetestuj i zwróć true, gdy zostanie znaleziona.for..of
byłoby kolejnym najlepszym rozwiązaniem tylko dla nowszych przeglądarek.Istnieje teraz jeszcze lepszy sposób na wykonanie tego w ECMAScript2015 (alias ES6) przy użyciu nowej pętli for . Na przykład ten kod nie drukuje elementów tablicy po liczbie 5:
Z dokumentów:
Potrzebujesz indeksu w iteracji? Możesz użyć
Array.entries()
:źródło
entries
. for (const [index, element] of someArray.entries ()) {// ...}Object.entries(myObject)
a następnie użyć dokładnie tak, jak wfor..in
przypadku tablicy. Zauważ, że tablice JS są w zasadzie obiektami pod maską: blog.niftysnippets.org/2011/01/myth-of-arrays.htmlMożesz użyć każdej metody:
ES6
do obsługi starej przeglądarki użyj:
więcej szczegółów tutaj .
źródło
[1,2,3].every( el => el !== 1 )
every
gwarantuje, że połączenia będą wykonywane po kolei?k
zaczyna się od 0 i jest zwiększany o 1: http://www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.everyCytowanie z dokumentacji MDN
Array.prototype.forEach()
:W swoim kodzie (w pytaniu), zgodnie z sugestią @bobince, użyj
Array.prototype.some()
zamiast tego. Bardzo dobrze pasuje do twojej skrzynki użytkownika.źródło
Niestety w tym przypadku będzie znacznie lepiej, jeśli nie użyjesz
forEach
. Zamiast tego użyj zwykłejfor
pętli, a teraz będzie działać dokładnie tak, jak można się spodziewać.źródło
Rozważ użycie
jquery
„seach
metody, ponieważ pozwala na return false wewnątrz funkcji oddzwaniania:Biblioteki Lodash zapewniają również
takeWhile
metodę, która może być powiązana z mapą / zmniejszeniem / foldem itp .:źródło
Z twojego przykładu kodu wygląda
Array.prototype.find
to, czego szukasz: Array.prototype.find () i Array.prototype.findIndex ()źródło
Jeśli chcesz skorzystać z sugestii Deana Edwarda i rzucić błąd StopIteration, aby wyjść z pętli bez wychwytywania błędu, możesz użyć następującej funkcji ( oryginalnie stąd ):
Powyższy kod daje możliwość uruchomienia kodu takiego jak poniżej bez konieczności wykonywania własnych klauzul try-catch:
Należy pamiętać, że spowoduje to aktualizację funkcji Array.prototype.forEach, jeśli już istnieje. Jeśli jeszcze nie istnieje, nie będzie go modyfikować.
źródło
Krótka odpowiedź: użyj
for...break
do tego lub zmień kod, aby uniknąć złamaniaforEach
. Nie używaj.some()
ani.every()
do emulacjifor...break
. Przepisz kod, aby uniknąćfor...break
pętli lub użyjfor...break
. Za każdym razem, gdy używasz tych metod jakofor...break
alternatywnego, Bóg zabija kociaka.Długa odpowiedź:
.some()
i.every()
obie zwracająboolean
wartość,.some()
zwraca,true
jeśli istnieje jakikolwiek element, dla którego przekazana funkcja zwracatrue
, każde zwracafalse
jeśli istnieje jakikolwiek element, dla którego przekazana funkcja zwracafalse
. To właśnie oznaczają te funkcje. Używanie funkcji do tego, co nie oznaczają, jest znacznie gorsze niż używanie tabel do układu zamiast CSS, ponieważ frustruje każdego, kto czyta twój kod.Ponadto jedynym możliwym sposobem wykorzystania tych metod jako
for...break
alternatywy jest.some()
wywołanie efektów ubocznych (zmiana niektórych zmiennych poza funkcją wywołania zwrotnego), i to niewiele różni się odfor...break
.Zatem użycie
.some()
lub.every()
jakofor...break
alternatywa pętli nie jest wolna od skutków ubocznych, nie jest to wtedy dużo czystszefor...break
, jest to frustrujące, więc nie jest lepiej.Zawsze możesz przepisać kod, aby nie było potrzeby
for...break
. Możesz filtrować tablicę za pomocą.filter()
, możesz podzielić tablicę za pomocą.slice()
i tak dalej, następnie użyj.forEach()
lub.map()
dla tej części tablicy.źródło
for...break
pętli, jeśli potrzebujesz wydajności.for
Pętla jest najbardziej wydajnych niż narzędzie iteracja.forEach()
,.any()
,.map()
,.filter()
itd.To jest coś, co wymyśliłem, aby rozwiązać problem ... Jestem prawie pewien, że rozwiązuje problem, który miał pierwotny pytający:
A potem nazwałbyś to używając:
Zwrócenie wartości false w funkcji wywołania zwrotnego spowoduje przerwanie. Daj mi znać, jeśli to nie zadziała.
źródło
=== false
może być lepsza niż== false
, abyś nie musiał jawnie zwracać wartości true (lub truey), aby kontynuować pętlę, aby ścieżka sterowania nie zwróciła wartości i pętla nieoczekiwanie pękła.Kolejna koncepcja, którą wymyśliłem:
źródło
Array.prototype.forEach()
.for
ibreak
istniał na długo przed tym pytaniem; PO szukał tego zachowania przy użyciu, bardziej funkcjonalnyforEach
.for...in
ibreak
.Znalazłem to rozwiązanie w innej witrynie. Możesz owinąć forEach w scenariuszu try / catch.
Więcej informacji tutaj: http://dean.edwards.name/weblog/2006/07/enum/
źródło
źródło
Jeśli nie potrzebujesz dostępu do tablicy po iteracji, możesz wyskoczyć, ustawiając długość tablicy na 0. Jeśli nadal potrzebujesz jej po iteracji, możesz ją sklonować za pomocą plasterka.
Lub z klonem:
Co jest znacznie lepszym rozwiązaniem niż zgłaszanie przypadkowych błędów w kodzie.
źródło
array.length
do0
nich są stosowane w bieżącej iteracji, więc prawdopodobnie jest to czasami lepiej jest użyćreturn
po takim przypisanieTo jest pętla for, ale zachowuje odwołanie do obiektu w pętli, podobnie jak forEach (), ale możesz się wyrwać.
źródło
Jak wspomniano wcześniej, nie możesz się złamać
.forEach()
.Oto nieco bardziej nowoczesny sposób wykonywania foreach za pomocą Iteratorów ES6. Umożliwia bezpośredni dostęp do
index
/value
podczas iteracji.Wynik:
Spinki do mankietów
Array.prototype.entries()
źródło
Jeszcze inne podejście
źródło
W tym celu używam nullhack , próbuje uzyskać dostęp do właściwości
null
, która jest błędem:źródło
throw BREAK
?Jeśli chcesz zachować
forEach
składnię, jest to sposób na utrzymanie jej wydajności (chociaż nie jest tak dobry jak zwykła pętla for). Natychmiast sprawdź zmienną, która wie, czy chcesz wyjść z pętli.W tym przykładzie użyto funkcji anonimowej do utworzenia zakresu funkcji, wokół
forEach
którego należy przechowywać wykonane informacje.Moje dwa centy.
źródło
Wiem, że to nie w odpowiedni sposób. To nie jest przerwa w pętli. To jest Jugad
źródło
Użyj
array.prototype.every
funkcji, która udostępnia narzędzie do przerwania pętli. Zobacz przykład tutaj dokumentację Javascript w sieci deweloperów Mozillaźródło
Zgadzam się z @bobince, przegłosowałem.
Również FYI:
Prototype.js ma coś w tym celu:
$break
zostanie przechwycony i obsłużony przez Prototype.js wewnętrznie, przerywając „każdy” cykl, ale nie generując błędów zewnętrznych.Aby uzyskać szczegółowe informacje, zobacz Prototype.JS API .
jQuery ma również sposób, po prostu zwróć false w module obsługi, aby wcześniej przerwać pętlę:
Szczegółowe informacje można znaleźć w interfejsie API jQuery .
źródło
Nie jest to najbardziej wydajne, ponieważ nadal cyklicznie wszystkie elementy, ale pomyślałem, że warto rozważyć bardzo proste:
źródło
continue
to słowo kluczowe, kod jest błędem składni.for of
pętlę ibreak;
od tego, jak zwykle.możesz postępować zgodnie z poniższym kodem, który działa dla mnie:
źródło
Wolę używać
for in
for in
działa podobnieforEach
, i możesz dodać funkcję powrotu do wyjścia w środku. Również lepsza wydajność.źródło
Jeśli potrzebujesz przerwać na podstawie wartości elementów, które są już w twojej tablicy, tak jak w twoim przypadku (tj. Jeśli warunek przerwania nie zależy od zmiennej czasu wykonywania, która może się zmienić po przypisaniu tablicy wartości jej elementów), możesz również użyć kombinacji funkcji slice () i indexOf () w następujący sposób.
Jeśli musisz przerwać, gdy forEach osiągnie „Apple”, możesz użyć
Jak stwierdzono w W3Schools.com metoda slice () zwraca wybrane elementy w tablicy, jako nowy obiekt tablicy. Oryginalna tablica nie zostanie zmieniona.
Zobacz to w JSFiddle
Mam nadzieję, że to komuś pomoże.
źródło
Można utworzyć wariant
forEach
, który pozwala nabreak
,continue
,return
, a nawetasync
/await
: (przykład napisany na maszynie)Stosowanie:
źródło
spróbuj z „znajdź”:
źródło
Tak, można kontynuować i wyjść z pętli forEach.
Aby kontynuować, możesz użyć return, pętla będzie kontynuowana, ale bieżąca funkcja się zakończy.
Aby wyjść z pętli, możesz ustawić trzeci parametr na 0, ustawić pustą tablicę. Pętla nie będzie kontynuowana, obecna funkcja tak, więc możesz użyć „return”, aby zakończyć, jak wyjście w normalnej pętli for ...
To:
wydrukuje to:
źródło
Wcześniej mój kod był poniżej
Zmieniłem poniżej, zostało to naprawione.
źródło