Mam obiekt w JavaScript:
{
abc: '...',
bca: '...',
zzz: '...',
xxx: '...',
ccc: '...',
// ...
}
Chcę użyć for
pętli, aby uzyskać jej właściwości. Chcę iterować go w częściach (nie we wszystkich właściwościach obiektu jednocześnie).
Za pomocą prostej tablicy mogę to zrobić za pomocą standardowej for
pętli:
for (i = 0; i < 100; i++) { ... } // first part
for (i = 100; i < 300; i++) { ... } // second
for (i = 300; i < arr.length; i++) { ... } // last
Ale jak to zrobić z przedmiotami?
Odpowiedzi:
W przypadku większości obiektów użyj
for .. in
:Z ES6, jeśli potrzebujesz zarówno kluczy, jak i wartości, zrób to
Aby uniknąć rejestrowania odziedziczonych właściwości, sprawdź za pomocą hasOwnProperty :
Nie musisz sprawdzać
hasOwnProperty
podczas iteracji na klawiszach, jeśli używasz prostego obiektu (na przykład takiego, którym sam się stworzyłeś{}
).Ta dokumentacja MDN wyjaśnia bardziej ogólnie, jak postępować z obiektami i ich właściwościami.
Jeśli chcesz to zrobić „fragmentami”, najlepiej jest wyodrębnić klucze z tablicy. Ponieważ zamówienie nie jest gwarantowane, jest to właściwy sposób. W nowoczesnych przeglądarkach możesz używać
Aby być bardziej kompatybilnym, lepiej wykonaj następujące czynności:
Następnie możesz iterować po swoich właściwościach według indeksu
yourobject[keys[i]]
:źródło
keys
z podanego kodu powinno wystarczyć.Oto kolejne rozwiązanie iteracyjne dla nowoczesnych przeglądarek:
Lub bez funkcji filtrowania:
Należy jednak wziąć pod uwagę, że właściwości w obiekcie JavaScript nie są sortowane, tzn. Nie mają kolejności.
źródło
Za pomocą
Object.entries
ciebie zrób coś takiego.Metoda Object.entries () zwraca tablicę własnej wyliczalnej właściwości danego obiektu [klucz, wartość]
Więc można iteracyjne nad obiekt i mieć
key
ivalue
dla każdego obiektu i dostać coś takiego.lub tak
W celach informacyjnych zapoznaj się z dokumentacją MDN dotyczącą pozycji obiektów
źródło
Dzięki nowym funkcjom ES6 / ES2015 nie musisz już używać obiektu do iteracji po skrócie. Możesz użyć mapy . Mapy Javascript utrzymują klucze w kolejności wstawiania, co oznacza, że możesz je powtarzać bez konieczności sprawdzania hasOwnProperty, co zawsze było naprawdę włamaniem.
Iteruj po mapie:
lub użyj dla każdego:
źródło
Jeśli potrzebujesz klucza i wartości podczas iteracji, możesz użyć pętli for ... z Object.entries .
źródło
Jedynym niezawodnym sposobem na to byłoby zapisanie danych obiektu w 2 tablicach, jednym z kluczy i jednym dla danych:
Następnie możesz iterować po tablicach, jak zwykle:
Nie używam
Object.keys(obj)
, bo to IE 9+.źródło
-> jeśli iterujemy obiekt JavaScript za pomocą i znajdujemy klucz tablicy obiektów
źródło
Jeśli chcesz iterować cały obiekt naraz, możesz użyć
for in
pętli:Ale jeśli chcesz podzielić obiekt na części, nie możesz tego zrobić. Nie ma gwarancji, że właściwości w obiekcie są w określonej kolejności. Dlatego mogę wymyślić dwa rozwiązania.
Pierwszym z nich jest „usunięcie” już odczytanych właściwości:
Innym rozwiązaniem, o którym mogę pomyśleć, jest użycie Array of Arrays zamiast obiektu:
Wtedy
for
będzie działać standardowa pętla.źródło
W końcu wymyśliłem przydatną funkcję narzędzia z ujednoliconym interfejsem do iterowania obiektów, ciągów, tablic, tablic typowych, map, zestawów (dowolnych Iterabeli).
https://github.com/alrik/iterate-javascript
źródło
Możesz spróbować skorzystać z lodash - nowoczesnej biblioteki narzędzi JavaScript zapewniającej modułowość, wydajność i dodatki js w celu szybkiego iterowania obiektu: -
źródło
Do iteracji obiektów zwykle używamy
for..in
pętli. Ta struktura będzie przechodzić przez wszystkie policzalne właściwości, w tym te, które są dziedziczone poprzez dziedziczenie prototypowe. Na przykład:Jednak
for..in
pętla nad wszystkimi elementami przeliczalnych i to nie będzie w stanie nas rozdzielić iteracji w kawałkach. Aby to osiągnąć, możemy użyć wbudowanejObject.keys()
funkcji, aby pobrać wszystkie klucze obiektu w tablicy. Następnie możemy podzielić iterację na wiele pętli i uzyskać dostęp do właściwości za pomocą tablicy kluczy. Na przykład:źródło
źródło
Object
s są w porządku. Oni nie są.If you can make sense of the sentence it worked
działa tylko ze względu na szczegóły implementacji. Nie ma gwarancji, że w ogóle będzie działać. Nie powinieneś także TitleCase swoich funkcji i zmiennych. To dlaclass
es.Naprawdę PITA, to nie jest część standardowego Javascript.
Uwaga: zmieniłem parametry wywołania zwrotnego na (wartość, klucz) i dodałem trzeci obiekt, aby interfejs API był spójny z innymi interfejsami API.
Użyj tego w ten sposób
źródło
this
dowolne dla wywołania zwrotnego, ponieważ wywołanie zwrotne ma swój własny kontekst.objectForEach
funkcję. Przepraszam, jeśli to było mylące.Tak. Możesz przechodzić przez obiekt za pomocą pętli for. Oto przykład
UWAGA: powyższy przykład działa tylko w IE9 +. Zobacz obsługę przeglądarki Objec.keys tutaj .
źródło
Wypróbuj online
źródło