W Javie można użyć for
pętli do przechodzenia przez obiekty w tablicy w następujący sposób:
String[] myStringArray = {"Hello", "World"};
for (String s : myStringArray)
{
// Do something
}
Czy możesz zrobić to samo w JavaScript?
javascript
arrays
loops
for-loop
Mark Szymański
źródło
źródło
for-in
pętla wylicza właściwości obiektu, bez określonej kolejności, a także wylicza właściwości odziedziczone. .. do iteracji po tablicach zawsze zalecane są sekwencyjne pętle ...in
iof
który może być używany i robić różne rzeczy. Następnie maszforEach
i brzydką i irytującą pętlę opartą na indeksie. Każdy inny współczesny język sprawia, że przeglądanie kolekcji jest łatwe i proste, bez niespodzianek i zamieszania. JS też może, ale nie robi.Odpowiedzi:
Masz kilka opcji:
1.
for
Pętla sekwencyjna :Plusy
break
icontinue
sterować przepływem instrukcjiCons
2. Array.prototype.forEach
Specyfikacja ES5 wprowadziła wiele korzystnych metod macierzy, jedną z nich
Array.prototype.forEach
i daje nam zwięzły sposób na iterację po tablicy:Mając prawie dziesięć lat od momentu napisania specyfikacji ES5 (grudzień 2009 r.), Została zaimplementowana przez prawie wszystkie nowoczesne silniki w środowiskach stacjonarnych, serwerowych i mobilnych, więc można z nich bezpiecznie korzystać.
Dzięki składni funkcji strzałek ES6 jest jeszcze bardziej zwięzły:
Funkcje strzałek są również szeroko implementowane, chyba że planujesz wspierać starożytne platformy (np. IE11); jesteś również bezpieczny.
Plusy
Cons
break
/continue
Zwykle można zastąpić konieczność
break
wyjścia z pętli imperatywnych, filtrując elementy tablicy przed iteracją, na przykład:Pamiętaj, że jeśli iterujesz tablicę, aby zbudować z niej kolejną tablicę , powinieneś użyć
map
, widziałem ten anty-wzór tyle razy.Anty-wzór:
Właściwy przypadek użycia mapy :
Ponadto, jeśli próbujesz zredukować tablicę do wartości, na przykład chcesz zsumować tablicę liczb, powinieneś użyć metody zmniejszania .
Anty-wzór:
Prawidłowe stosowanie redukcji :
3.
for-of
Oświadczenie ES6Standard ES6 wprowadza koncepcję obiektów iterowalnych i definiuje nową konstrukcję do przeszukiwania danych,
for...of
oświadczenie.Ta instrukcja działa dla każdego rodzaju iterowalnego obiektu, a także dla generatorów (każdego obiektu, który ma
[Symbol.iterator]
właściwość).Obiekty tablic są z definicji wbudowanymi iterowaniami w ES6, więc możesz na nich użyć tej instrukcji:
Plusy
break
/continue
).Cons
Nie używaj
for...in
@zipcodeman sugeruje użycie
for...in
instrukcji, ale w przypadku tablic iteracyjnychfor-in
należy unikać tej instrukcji, która służy do wyliczenia właściwości obiektu.Nie należy go używać do obiektów podobnych do tablicy, ponieważ:
Druga kwestia polega na tym, że może sprawić wiele problemów, na przykład jeśli rozszerzysz
Array.prototype
obiekt o metodę, właściwość ta zostanie również wyliczona.Na przykład:
Powyższy kod będzie zawierał logi „a”, „b”, „c” i „foo!”.
Jest to szczególnie problem, jeśli korzystasz z biblioteki, która w dużym stopniu opiera się na rozszerzaniu natywnych prototypów (na przykład MooTools).
for-in
Oświadczenie powiedziałem wcześniej jest tam, aby wyliczyć właściwości obiektu, na przykład:W powyższym przykładzie
hasOwnProperty
metoda pozwala wyliczyć tylko własne właściwości , to jest to, tylko właściwości, które fizycznie ma obiekt, bez dziedziczonych właściwości.Poleciłbym przeczytać następujący artykuł:
źródło
false
,undefined
,0
,""
,NaN
.Tak, zakładając, że twoja implementacja zawiera
for
...of
funkcję wprowadzoną w ECMAScript 2015 (wydanie „Harmony”)… co jest całkiem bezpiecznym założeniem w dzisiejszych czasach.Działa to tak:
Albo jeszcze lepiej, ponieważ ECMAScript 2015 zapewnia również zmienne o zasięgu blokowym:
(Zmienna
s
jest inna dla każdej iteracji, ale nadal może być zadeklarowanaconst
w ciele pętli, o ile nie jest tam modyfikowana).Uwaga na rzadkie tablice: tablica w JavaScript może tak naprawdę nie przechowywać tylu elementów, ile zgłasza
length
; podana liczba jest po prostu o jeden większa niż najwyższy wskaźnik, pod którym przechowywana jest wartość. Jeśli tablica zawiera mniej elementów niż wskazuje jej długość, mówi się, że jest rzadka . Na przykład, całkowicie uzasadnione jest posiadanie tablicy z elementami tylko o indeksach 3, 12 i 247;length
takiej tablicy jest zgłaszane jako 248, choć w rzeczywistości jest tylko 3 przechowywania wartości. Jeśli spróbujesz uzyskać dostęp do elementu w dowolnym innym indeksie, tablica będzie miałaundefined
tam wartość. Kiedy więc chcesz „zapętlić” tablicę, musisz odpowiedzieć na pytanie: czy chcesz zapętlić cały zakres wskazany przez jego długość i procesundefined
s dla brakujących elementów, czy chcesz przetwarzać tylko te elementy, które faktycznie są obecne? Istnieje wiele aplikacji dla obu podejść; to zależy tylko od tego, do czego używasz tablicy.Jeśli wykonasz iterację po tablicy za pomocą
for
...of
, treść pętli jest wykonywanalength
razy, a zmienna sterująca pętli jest ustawianaundefined
na dowolne elementy, które faktycznie nie występują w tablicy. W zależności od szczegółów kodu „zrób coś z” takie zachowanie może być tym, czego chcesz, ale jeśli nie, powinieneś zastosować inne podejście.Oczywiście, niektórzy deweloperzy nie mają wyboru, aby użyć innego podejścia tak, ponieważ z jakiegoś powodu są one kierowane na wersję JavaScript, który nie obsługuje jeszcze
for
...of
.Tak długo, jak implementacja JavaScript jest zgodna z poprzednią edycją specyfikacji ECMAScript (która wyklucza na przykład wersje Internet Explorera przed 9), możesz użyć
Array#forEach
metody iteratora zamiast pętli. W takim przypadku przekazujesz funkcję, która ma zostać wywołana dla każdego elementu w tablicy:W przeciwieństwie do
for
...of
,.forEach
wywołuje funkcję tylko dla elementów, które faktycznie są obecne w tablicy. Jeśli przejdzie przez naszą hipotetyczną tablicę z trzema elementami i długością 248, wywoła funkcję tylko trzy razy, a nie 248 razy. Rozróżnia także brakujące elementy od elementów, które są ustawioneundefined
; w drugim przypadku nadal wywoła funkcję, przekazującundefined
jako argument. Jeśli jest to w jaki sposób chcesz obsługiwać macierze rzadkie,.forEach
może być droga, nawet jeśli obsługuje tłumaczafor
...of
.Ostatnią opcją, która działa we wszystkich wersjach JavaScript, jest wyraźna pętla zliczania . Po prostu liczysz od 0 do jednego mniej niż długość i używasz licznika jako indeksu. Podstawowa pętla wygląda następująco:
Zaletą tego podejścia jest to, że możesz wybrać sposób obsługi rzadkich tablic; Powyższy kod będzie działał ciało pełne pętli
length
razy, zs
zestawem doundefined
wszelkich brakujących elementów, podobnie jakfor
..of
. Jeśli zamiast tego chcesz obsługiwać tylko faktycznie obecne elementy rzadkiej tablicy,.forEach
możesz dodać prostyin
test do indeksu:Przypisanie wartości długości zmiennej lokalnej (w przeciwieństwie do włączenia pełnego
myStringArray.length
wyrażenia w warstwie pętli) może mieć znaczącą różnicę w wydajności, ponieważ pomija wyszukiwanie właściwości za każdym razem; przy użyciu Rhino na moim komputerze, przyspieszenie wynosi 43%.Możesz zobaczyć buforowanie długości wykonane w klauzuli inicjalizacji pętli, jak poniżej:
Wyraźna pętla zliczania oznacza również, że masz dostęp do indeksu każdej wartości, jeśli chcesz. Indeks jest także przekazywany jako dodatkowy parametr do funkcji, którą przekazujesz
forEach
, więc możesz uzyskać do niego dostęp również w ten sposób:for
...of
nie daje indeksu powiązanego z każdym obiektem, ale dopóki obiekt, który iterujesz, jest w rzeczywistościArray
(for
..of
działa dla innych typów iterowalnych, które mogą nie mieć tej metody), możesz użyć tablicy Metoda #entries , aby zmienić ją na tablicę par [indeks, pozycja], a następnie iterować:for
...in
składnia wspomniano przez innych jest dla zapętlenie nad właściwości obiektu; ponieważ tablica w JavaScript jest tylko obiektem z numerycznymi nazwami właściwości (i automatycznie aktualizowanąlength
właściwością), teoretycznie można za jej pomocą łączyć się z tablicą. Problem polega jednak na tym, że nie ogranicza się on do liczbowych wartości właściwości (pamiętaj, że nawet metody są w rzeczywistości właściwościami, których wartością jest zamknięcie), ani nie ma gwarancji, że będą iterować w stosunku do tych w kolejności numerycznej. Dlatego składniafor
... niein
powinna być używana do zapętlania tablic.źródło
i in myStringArray
tego przykładu? Jak to może być fałsz?a=[1,2,3,4]; delete a[2]; for (j in a) { console.log(j); }
wyniki 0, 1, 3 i 4.a.length
to wciąż 5.for j in a
. Wykazuję, żein
czek nie jest zbędny, tak jak twierdziłeś, pokazując wszystkie indeksy i pokazując, że jest jeden między 0 ilength-1
że go nie ma. Mógłbym też właśnie wydrukować2 in a
, co jest rzeczywiściefalse
, pomimo faktu, że powiedziałeś, że to niemożliwe.Możesz użyć
map
, która jest funkcjonalną techniką programowania, która jest również dostępna w innych językach, takich jak Python i Haskell .Ogólna składnia to:
Ogólnie rzecz biorąc
func
, wziąłby jeden parametr, który jest elementem tablicy. Ale w przypadku JavaScript może on przyjąć drugi parametr, który jest indeksem elementu, i trzeci parametr, który jest samą tablicą.Zwracana wartość
array.map
to kolejna tablica, więc możesz użyć jej w następujący sposób:A teraz x jest
[10,20,30,40]
.Nie musisz pisać funkcji bezpośrednio. Może to być osobna funkcja.
co byłoby swego rodzaju odpowiednikiem:
Tyle że nie dostaniesz
new_list
.źródło
Array.forEach
.map
służy do generowania nowej tablicy.Array.prototype.map
metoda jest częścią standardu ECMAScript 5. edycja, nie jest jeszcze dostępna we wszystkich implementacjach (np. jej brak w IE), również do iteracji po tablicy Myślę, żeArray.prototype.forEach
metoda jest bardziej semantycznie poprawna ... proszę również nie t zasugerować oświadczenie for-in, zobacz moją odpowiedź, aby uzyskać więcej informacji :)forEach
imap
polega na tym, że ten pierwszy nie zwraca wyników iteracji.map
(czasami akacollect
, ale bardzo różni się odapply
) jest wyraźnie przekształcenie każdego elementu tablicy w odpowiedni wynik; jest to mapowanie 1 do 1 , stąd nazwa. Jest to część całej rodziny operacji, które obejmująreduce
(która daje pojedynczy wynik z całej tablicy) ifilter
(która tworzy podzbiór oryginalnej tablicy) i tak dalej. Podczas gdyforEach
robi coś z każdym elementem, semantyka nie jest określona.W JavaScript nie zaleca się przechodzenia przez tablicę za pomocą pętli for-in, ale lepiej jest użyć
for
pętli, takiej jak:Jest również zoptymalizowany („buforowanie” długości tablicy). Jeśli chcesz dowiedzieć się więcej, przeczytaj mój post na ten temat .
źródło
++i
zamiasti++
++i
toi_stop
lubi_end
zamiast niejlen
. Jest tak samo czytelny (jeśli nie bardziej!) I naturalnie unikniesz tego rodzaju problemów (ponieważ twoja druga pętla dostanie npj_stop
.).for (lets of myStringArray) {
(Bezpośrednio odpowiadając na twoje pytanie: teraz możesz!)
Większość innych odpowiedzi jest poprawnych, ale nie wspominają (od tego momentu), że ECMA Script
62015 wprowadza nowy mechanizm wykonywania iteracji,for..of
pętlę.Ta nowa składnia jest najbardziej eleganckim sposobem na iterację tablicy w javascript (o ile nie potrzebujesz indeksu iteracji).
Obecnie działa z Firefox 13+, Chrome 37+ i nie działa natywnie z innymi przeglądarkami (patrz kompatybilność przeglądarki poniżej). Na szczęście mamy kompilatory JS (takie jak Babel ), które pozwalają nam dziś korzystać z funkcji nowej generacji.
Działa również na węźle (przetestowałem go na wersji 0.12.0).
Iterowanie tablicy
Iterowanie tablicy obiektów
Iterowanie generatora:
(przykład wyodrębniony z https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of )
Tabela kompatybilności: http://kangax.github.io/es5-compat-table/es6/#For..of loop
Spec: http://wiki.ecmascript.org/doku.php?id=harmony:iterators
}
źródło
const s
zamiastvar s
var s of arr
jest prawie dwukrotnie (1,9x) czas wykonania w porównaniu do użycia prostego licznika pętli for i pobierania elementów według indeksu w nodejsOpera, Safari, Firefox i Chrome udostępniają teraz zestaw ulepszonych metod Array do optymalizacji wielu popularnych pętli.
Możesz nie potrzebować wszystkich, ale mogą być bardzo przydatne lub byłyby, gdyby każda przeglądarka je obsługiwała.
Mozilla Labs opublikowało algorytmy, których używają i WebKit , abyś mógł je dodać samodzielnie.
Filtr zwraca tablicę elementów, które spełniają określone warunki lub testy.
każdy zwraca wartość true, jeśli każdy element tablicy przejdzie test.
niektóre zwracają prawdę, jeśli w ogóle zdadzą test.
forEach uruchamia funkcję na każdym elemencie tablicy i niczego nie zwraca.
mapa jest jak forEach, ale zwraca tablicę wyników operacji dla każdego elementu.
Wszystkie te metody przyjmują funkcję dla pierwszego argumentu i mają opcjonalny drugi argument, który jest obiektem, którego zakres chcesz narzucić członkom tablicy podczas ich przechodzenia przez funkcję.
Zignoruj to, aż będziesz go potrzebować.
indexOf i lastIndexOf znajdują odpowiednią pozycję pierwszego lub ostatniego elementu, która dokładnie pasuje do jego argumentu.
źródło
Wprowadzenie
Od czasu studiów studiowałem w Javie, JavaScript, Pascal, ABAP , PHP, Progress 4GL, C / C ++ i prawdopodobnie w kilku innych językach, o których nie mogę teraz myśleć.
Chociaż wszystkie mają swoje osobliwości językowe, każdy z tych języków ma wiele takich samych podstawowych pojęć. Takie pojęcia obejmują procedury / funkcje
IF
,FOR
-statements,WHILE
-loops i -loops.Tradycyjna
for
pętlaTradycyjna
for
pętla składa się z trzech elementów:Te trzy elementy są oddzielone od siebie
;
symbolem. Treść dla każdego z tych trzech składników jest opcjonalna, co oznacza, że następująca jest najbardziej minimalnafor
możliwa pętla:Oczywiście, musisz dołączyć
if(condition === true) { break; }
lubif(condition === true) { return; }
gdzieś wewnątrz tejfor
pętli, aby przestała działać.Zwykle jednak inicjacja służy do deklarowania indeksu, warunek służy do porównania tego indeksu z wartością minimalną lub maksymalną, a przemyślenie służy do zwiększenia indeksu:
Używanie tradycyjnej
for
pętli do przechodzenia przez tablicęTradycyjny sposób przechodzenia przez tablicę jest następujący:
Lub, jeśli wolisz zapętlać wstecz, wykonaj następujące czynności:
Istnieje jednak wiele odmian, na przykład ta:
...albo ten...
...albo ten:
To, co działa najlepiej, zależy w dużej mierze zarówno od osobistego gustu, jak i konkretnego przypadku zastosowania, który wdrażasz.
Pamiętaj, że każda z tych odmian jest obsługiwana przez wszystkie przeglądarki, w tym bardzo bardzo stare!
while
pętliJedną alternatywą dla
for
pętli jestwhile
pętla. Aby przejść przez tablicę, możesz to zrobić:Podobnie jak tradycyjne
for
pętle,while
pętle są obsługiwane nawet przez najstarszą przeglądarkę.Pamiętaj również, że pętla while może być przepisana jako
for
pętla. Na przykładwhile
powyższa pętla zachowuje się dokładnie tak samo, jak tafor
pętla:For...in
ifor...of
W JavaScript możesz także to zrobić:
Należy to jednak stosować ostrożnie, ponieważ nie zachowuje się tak samo jak tradycyjna
for
pętla we wszystkich przypadkach i należy wziąć pod uwagę potencjalne skutki uboczne. Zobacz: Dlaczego używanie „dla ... w” z iteracją tablicy jest złym pomysłem? po więcej szczegółów.Alternatywą dla
for...in
jest teraz takżefor...of
. Poniższy przykład pokazuje różnicę międzyfor...of
pętlą afor...in
pętlą:Ponadto należy wziąć pod uwagę, że żadna wersja programu Internet Explorer nie obsługuje
for...of
( Edge 12+ obsługuje), a tofor...in
wymaga co najmniej Internet Explorera 10.Array.prototype.forEach()
Alternatywą dla opcji
for
-loops jestArray.prototype.forEach()
użycie następującej składni:Array.prototype.forEach()
jest obsługiwany przez wszystkie nowoczesne przeglądarki, a także Internet Explorer 9 i nowsze wersje.Biblioteki
Wreszcie, wiele bibliotek narzędzi ma również swoje własne
foreach
odmiany. AFAIK, trzy najpopularniejsze to:jQuery.each()
, w jQuery :_.each()
, w Underscore.js :_.forEach()
, w Lodash.js :źródło
Użyj pętli while ...
logi: „jeden”, „dwa”, „trzy”
A dla odwrotnej kolejności jeszcze bardziej wydajna pętla
logi: „trzy”, „dwa”, „jeden”
Lub klasyczna
for
pętlalogi: „jeden”, „dwa”, „trzy”
Odniesienie: http://www.sitepoint.com/google-closure-how-not-to-write-javascript/
źródło
Jeśli chcesz zwięzły sposób napisać szybką pętlę i możesz iterować w odwrotnej kolejności:
Ma to tę zaletę, że buforuje długość (podobną
for (var i=0, len=myArray.length; i<len; ++i)
i niepodobnąfor (var i=0; i<myArray.length; ++i)
), a jednocześnie jest mniej znaków do wpisania.Są nawet chwile, kiedy powinieneś iterować w odwrotnej kolejności, na przykład podczas iteracji nad aktywną listą NodeList, na której planujesz usuwanie elementów z DOM podczas iteracji.
źródło
for (var i=0,len=array.length;i<len;++i)
była popularną, rozsądną pętlą do pisania.Niektóre przypadki użycia pętli przez tablicę w funkcjonalnym sposobie programowania w JavaScript:
1. Po prostu przejdź przez tablicę
Uwaga: Array.prototype.forEach () nie jest ściśle funkcjonalnym sposobem, ponieważ funkcja, którą przyjmuje jako parametr wejściowy, nie powinna zwracać wartości, która w związku z tym nie może być uważana za funkcję czystą.
2. Sprawdź, czy którykolwiek z elementów tablicy ma pozytywny wynik testu
3. Przekształć w nową tablicę
Uwaga: Metoda map () tworzy nową tablicę z wynikami wywołania podanej funkcji na każdym elemencie tablicy wywołującej.
4. Zsumuj określoną właściwość i oblicz jej średnią
5. Utwórz nową tablicę na podstawie oryginału, ale bez modyfikacji
6. Policz liczbę każdej kategorii
7. Pobierz podzbiór tablicy na podstawie określonych kryteriów
Uwaga: Metoda filter () tworzy nową tablicę ze wszystkimi elementami, które pomyślnie przejdą test zaimplementowany przez podaną funkcję.
8. Posortuj tablicę
9. Znajdź element w tablicy
Metoda Array.prototype.find () zwraca wartość pierwszego elementu w tablicy, który spełnia podaną funkcję testową.
Bibliografia
źródło
Istnieje sposób, aby to zrobić, gdy masz bardzo niewielki ukryty zasięg w swojej pętli i eliminujesz dodatkowe zmienne.
Lub jeśli naprawdę chcesz uzyskać identyfikator i mieć naprawdę klasyczną
for
pętlę:Nowoczesne przeglądarki wszystkie metody iteracyjnej wsparcie
forEach
,map
,reduce
,filter
i wiele innych sposobów na prototypie Array .źródło
Istnieje wiele sposobów na przeglądanie tablicy w JavaScript.
Pętla ogólna:
ES5's forEach:
jQuery.each:
Spójrz na to, aby uzyskać szczegółowe informacje, możesz też sprawdzić MDN pod kątem zapętlania tablicy w JavaScript i używania jQuery sprawdzania jQuery dla każdego .
źródło
Poleciłbym całkowicie skorzystać z biblioteki underscore.js . Zapewnia różne funkcje, których można używać do iteracji po tablicach / kolekcjach.
Na przykład:
źródło
underscore
jeśli dodano ECMA-262forEach
methor. Kod macierzysty jest zawsze lepszy.Pętla tablicowa:
Pętla obiektowa:
źródło
Tak , możesz zrobić to samo w JavaScript za pomocą pętli, ale nie jest to ograniczone , istnieje wiele sposobów wykonywania pętli nad tablicami w JavaScript. Wyobraź sobie, że masz tę tablicę poniżej i chcesz zrobić nad nią pętlę:
Oto rozwiązania:
1) Dla pętli
for
Pętla jest powszechnym sposobem zapętlenie poprzez tablice w JavaScript, ale nie traktować jako najszybszych rozwiązań dla dużych tablic:2) Podczas pętli
Pętla while jest uważana za najszybszy sposób na przechodzenie przez długie tablice, ale zwykle jest rzadziej używana w kodzie JavaScript:
3) Wykonaj, gdy
A
do while
robi to samo, cowhile
z pewną różnicą składni, jak poniżej:Są to główne sposoby wykonywania pętli JavaScript, ale jest na to jeszcze kilka sposobów.
Używamy również
for in
pętli do zapętlania obiektów w JavaScript.Również spojrzeć na
map()
,filter()
,reduce()
, itd funkcji na tablicy w JavaScript. Mogą robić rzeczy znacznie szybciej i lepiej niż przy użyciuwhile
ifor
.To dobry artykuł, jeśli chcesz dowiedzieć się więcej o funkcjach asynchronicznych w tablicach w JavaScript.
Czytaj więcej >> tutaj :
źródło
Jeśli ktoś jest zainteresowany wydajnością wielu mechanizmów dostępnych dla iteracji macierzy, przygotowałem następujące testy JSPerf:
https://jsperf.com/fastest-array-iterator
Wyniki:
Tradycyjny
for()
iterator jest zdecydowanie najszybszą metodą, szczególnie gdy jest używany z buforowaną długością tablicy .Metody
Array.prototype.forEach()
iArray.prototype.map()
są najwolniejszymi przybliżeniami, prawdopodobnie w wyniku narzutu wywołania funkcji .źródło
i = i +1
zamiasti++
Jeśli korzystasz z biblioteki jQuery, rozważ użycie http://api.jquery.com/jQuery.each/
Z dokumentacji:
źródło
Nie widziałem jeszcze tej odmiany, która osobiście najbardziej mi się podoba:
Biorąc pod uwagę tablicę:
Możesz na nim zapętlić, nie uzyskując dostępu do właściwości length:
Zobacz ten JsFiddle wykazujący, że: http://jsfiddle.net/prvzk/
Działa to tylko w przypadku tablic, które nie są rzadkie. Oznacza to, że faktycznie każdy indeks w tablicy ma wartość. Odkryłem jednak, że w praktyce rzadko używam rzadkich tablic w JavaScript ... W takich przypadkach zwykle łatwiej jest użyć obiektu jako mapy / tablicy mieszającej. Jeśli masz rzadką tablicę i chcesz zapętlić ponad 0 .. długość-1, potrzebujesz konstrukcji for (var i = 0; i <someArray.length; ++ i), ale nadal potrzebujesz
if
wewnętrznej pętli aby sprawdzić, czy element o bieżącym indeksie jest rzeczywiście zdefiniowany.Ponadto, jak wspomina CMS w komentarzu poniżej, możesz używać tego tylko w tablicach, które nie zawierają żadnych wartości fałszowania. Tablica ciągów z przykładu działa, ale jeśli masz puste ciągi lub liczby, które są 0 lub NaN itp., Pętla przedwcześnie się zerwie. Znowu w praktyce nie jest to dla mnie problemem, ale należy o tym pamiętać, co sprawia, że jest to pętla do przemyślenia przed użyciem ... To może zdyskwalifikować niektóre osoby :)
W tej pętli podoba mi się:
Powodem tego jest to, że specyfikacja tablicy nakazuje, aby po odczytaniu elementu z indeksu> = długość tablicy zwrócił niezdefiniowany. Gdy napiszesz w takiej lokalizacji, faktycznie zaktualizuje długość.
Dla mnie ten konstrukt najbardziej naśladuje składnię Java 5, którą kocham:
... z dodatkową korzyścią wynikającą z wiedzy o bieżącym indeksie wewnątrz pętli
źródło
0
,false
,NaN
,null
lubundefined
, jeszcze zanimi
osiągnie długość, np jsfiddle.net/prvzk/1(item=someArray[i]) !== undefined
.Istnieje metoda iteracji tylko nad własnymi właściwościami obiektu, nie obejmującymi właściwości prototypu:
ale nadal będzie iterować po niestandardowych właściwościach.
W JavaScript każda własność niestandardowa może być przypisana do dowolnego obiektu, w tym tablicy.
Jeśli ktoś chce iteracyjne nad sparsed tablicy,
for (var i = 0; i < array.length; i++) if (i in array)
lubarray.forEach
zees5shim
powinien być stosowany.źródło
for (var i in array) if (++i)
?Jest kilka sposobów na zrobienie tego w JavaScript. Pierwsze dwa przykłady to próbki JavaScript. Trzecia wykorzystuje bibliotekę JavaScript, czyli jQuery korzystającą z tej
.each()
funkcji.źródło
for...in
należy unikać obiektów podobnych do tablicyNajbardziej elegancki i szybki sposób
http://jsperf.com/native-loop-performance/8
Edytowane (ponieważ się myliłem)
Porównywanie metod zapętlania tablicy 100 000 elementów i za każdym razem wykonuj minimalną operację z nową wartością.
Przygotowanie:
Testy:
źródło
Zoptymalizowane podejście polega na buforowaniu długości tablicy i użyciu wzorca pojedynczego var inicjującego wszystkie zmienne jednym słowem kluczowym var.
Jeśli kolejność iteracji nie ma znaczenia, powinieneś wypróbować odwróconą pętlę, jest to najszybsze, ponieważ zmniejsza testowanie warunków ogólnych i dekrementacja jest w jednym wyrażeniu:
lub lepszy i czystszy w użyciu podczas pętli while:
źródło
W JavaScript jest tak wiele rozwiązań do zapętlania tablicy.
Poniższy kod jest popularny
źródło
Jeśli chcesz użyć jQuery, ma ładny przykład w swojej dokumentacji:
źródło
Moim zdaniem najlepszym sposobem jest użycie funkcji Array.forEach. Jeśli nie możesz tego użyć, sugerowałbym, abyś otrzymał polifill z MDN. Aby był dostępny, jest to z pewnością najbezpieczniejszy sposób na iterację tablicy w JavaScript.
Array.prototype.forEach ()
Tak jak sugerowali inni, prawie zawsze tego chcesz:
Zapewnia to, że wszystko, czego potrzebujesz w zakresie przetwarzania tablicy, pozostanie w tym zakresie i że przetwarzasz tylko wartości tablicy, a nie właściwości obiektu i innych elementów, co się
for ..
dzieje.Używając zwykłego stylu C.
for
pętli w działa w większości przypadków. Należy tylko pamiętać, że wszystko w pętli ma ten sam zakres co reszta programu, {} nie tworzy nowego zakresu.W związku z tym:
wyświetli „11” - co może, ale nie musi być tym, czego chcesz.
Działający przykład jsFiddle: https://jsfiddle.net/workingClassHacker/pxpv2dh5/7/
źródło
Nie jest w 100% identyczny, ale podobny:
źródło
Na przykład użyłem w konsoli Firefox:
źródło
Dużo czystsze ...
źródło
z.forEach(j => console.log(j));
.Krótka odpowiedź: tak. Możesz to zrobić:
W konsoli przeglądarki można wydrukować coś takiego jak „element1”, „element2” itp.
źródło
Możesz użyć
Array.prototype.forEach(...)
:Lub
Array.prototype.map(...)
:Lub jquery lub wcześniej wspomniane sposoby pętli.
źródło