Jak mogę zapętlić wszystkie elementy w obiekcie JavaScript, w tym wartości będące obiektami.
Na przykład, w jaki sposób mogę przez to przejść (uzyskując dostęp do „nazwa_użytkownika” i „nazwa_użytkownika” dla każdego z nich)?
var validation_messages = {
"key_1": {
"your_name": "jimmy",
"your_msg": "hello world"
},
"key_2": {
"your_name": "billy",
"your_msg": "foo equals bar"
}
}
javascript
edt
źródło
źródło
Odpowiedzi:
źródło
for in
jest bardzo podobny do tradycyjnegoforeach
.W ECMAScript 5 możesz łączyć
Object.keys()
iArray.prototype.forEach()
:źródło
for ... in ... hasOwnProperty
Wzór można nazwać na niczym, o ile mogę powiedzieć (obiekt, array, null, niezdefiniowane, true, false, numer prymitywne, obiekty).Object.keys()
jest powolne, to raczej ciągłyforEach()
dostęp do.length
! Jeślifor
zamiast tego użyjesz klasycznej pętli, w przeglądarce Firefox 33 jest ona prawie dwa razy szybsza niżfor..in
+.hasOwnProperty()
Problem z tym
polega na tym, że będziesz również przechodzić przez prototyp pierwotnego obiektu.
Dzięki temu unikniesz tego:
źródło
hasOwnProperty
wewnątrz firmyfor
-in
pętle.W ES6 / 2015 możesz przechodzić przez taki obiekt: (używając funkcji strzałki )
jsbin
W ES7 / 2016 możesz używać
Object.entries
zamiast tegoObject.keys
i przechodzić przez taki obiekt:Powyższe działałoby również jako jednolinijka :
jsbin
Jeśli chcesz również zapętlić zagnieżdżone obiekty, możesz użyć funkcji rekurencyjnej (ES6):
jsbin
Taki sam jak funkcja powyżej, ale z ES7
Object.entries()
zamiastObject.keys()
:Tutaj przechodzimy przez obiekty zagnieżdżone, zmieniamy wartości i zwracamy nowy obiekt za jednym razem, używając w
Object.entries()
połączeniu zObject.fromEntries()
( ES10 / 2019 ):źródło
Korzystanie z Underscore.js
_.each
:źródło
Jeśli użyjesz rekurencji, możesz zwrócić właściwości obiektu o dowolnej głębokości
źródło
I. klucze muszą być dostępne,
✔
of
iObject.keys
podejście✔
in
podejścieUżywaj tego z ostrożnością, ponieważ może wydrukować właściwości prototypu
obj
✔ podejście ES7
Jednak podczas edycji nie polecałbym metody ES7, ponieważ JavaScript inicjuje wiele zmiennych wewnętrznie, aby zbudować tę procedurę (zobacz dowody zwrotne dla potwierdzenia). Jeśli nie tworzysz ogromnej aplikacji, która zasługuje na optymalizację, jest w porządku, ale jeśli optymalizacja jest twoim priorytetem, powinieneś o tym pomyśleć.
II. musimy tylko uzyskać dostęp do każdej wartości,
✔
of
iObject.values
podejścieWięcej informacji zwrotnych na temat testów:
Object.keys
lubObject.values
wydajność jest znikomaNa przykład,
Na
Object.values
przykład użycie natywnejfor
pętli ze zmiennymi buforowanymi w Firefoksie wydaje się nieco szybsze niż użyciefor...of
pętli. Różnica nie jest jednak tak ważna, a Chrome działafor...of
szybciej niż natywnafor
pętla, dlatego polecam korzystaćfor...of
z niejObject.values
w każdym przypadku (4. i 6. test).W przeglądarce Firefox
for...in
pętla jest bardzo wolna, więc jeśli chcemy buforować klucz podczas iteracji, lepiej jest go użyćObject.keys
. Dodatkowo Chrome działa na obu strukturach z jednakową prędkością (pierwszy i ostatni test).źródło
Wiem, że jest późno, ale napisanie tej zoptymalizowanej i ulepszonej wersji odpowiedzi AgileJon zajęło mi 2 minuty:
źródło
hasOwnProperty
wowns
, a następnie wywołanieowns.call(obj, prop)
zamiast po prostu wywołanieobj.hasOwnProperty(prop)
jak ta odpowiedź robi?obj
może miećhasOwnProperty
zdefiniowaną funkcję na sobie, więc nie będzie korzystać z tej zObject.prototype
. Możesz wypróbować przed takąfor
pętląobj.hasOwnProperty = function(){return false;}
i nie będzie iterować po żadnej właściwości.źródło
p jest wartością
LUB
źródło
W ES7 możesz wykonać:
źródło
źródło
Niewiele sposobów na zrobienie tego ...
1) 2 warstwy dla ... w pętli ...
2) Korzystanie
Object.key
3) Funkcja rekurencyjna
I nazwij to tak:
źródło
Oto ulepszona i rekurencyjna wersja rozwiązania AgileJon ( demo ):
To rozwiązanie działa na różnego rodzaju głębokościach.
źródło
Inna opcja:
źródło
ECMAScript-2017, właśnie ukończony miesiąc temu, wprowadza Object.values (). Teraz możesz to zrobić:
źródło
Myślę, że warto zauważyć, że jQuery ładnie to rozwiązuje
$.each()
.Zobacz: https://api.jquery.com/each/
Na przykład:
$(this)
będąc pojedynczym przedmiotem wewnątrz obiektu. Zamień$('.foo')
na zmienną, jeśli nie chcesz używać silnika wyboru jQuery.źródło
Do przechodzenia przez obiekt JavaScript możemy użyć forEach, a do optymalizacji kodu możemy użyć funkcji strzałki
źródło
Nie mogłem nakłonić powyższych postów do zrobienia tego, o co mi chodziło.
Po przeanalizowaniu innych odpowiedzi tutaj zrobiłem to. Jest hacky, ale działa!
Dla tego obiektu:
... ten kod:
... tworzy to w konsoli:
źródło
Rozwiązanie, które działa dla mnie, jest następujące
źródło
Egzotyczny - głęboki trawers
W tym rozwiązaniu wykorzystujemy zamiennik, który pozwala na głębokie przemierzanie całego obiektu i obiektów zagnieżdżonych - na każdym poziomie otrzymasz wszystkie pola i wartości. Jeśli potrzebujesz uzyskać pełną ścieżkę do każdego pola, spójrz tutaj
Pokaż fragment kodu
źródło
W moim przypadku (na podstawie powyższego) możliwa jest dowolna liczba poziomów.
wynik:
źródło