var obj = {
name: "Simon",
age: "20",
clothing: {
style: "simple",
hipster: false
}
}
for(var propt in obj){
console.log(propt + ': ' + obj[propt]);
}
W jaki sposób zmienna propt
reprezentuje właściwości obiektu? To nie jest wbudowana metoda ani właściwość. Dlaczego wymyśla każdą właściwość w obiekcie?
javascript
loops
object
Rafay
źródło
źródło
if (typeof(obj[propt]) === 'object') {
/ * Zrób to ponownie * /}
Odpowiedzi:
Iteracja po właściwościach wymaga tej dodatkowej
hasOwnProperty
kontroli:Jest to konieczne, ponieważ prototyp obiektu zawiera dodatkowe właściwości obiektu, które technicznie są jego częścią. Te dodatkowe właściwości są dziedziczone z podstawowej klasy obiektowej, ale nadal są właściwościami
obj
.hasOwnProperty
po prostu sprawdza, czy jest to właściwość specyficzna dla tej klasy, a nie dziedziczona z klasy podstawowej.Możliwe jest również wywołanie
hasOwnProperty
samego obiektu:Ale to się nie powiedzie, jeśli obiekt ma niepowiązane pole o tej samej nazwie:
Dlatego bezpieczniej jest
Object.prototype
zamiast tego zadzwonić :źródło
object.hasOwnProperty()
? Czy fakt, żeproperty
ma jakąkolwiek wartość, nie sugeruje, że jest w tymobject
?property
jest tutaj ciągiem, powinien był zostać wywołanypropertyName
. W przeciwnym razie może powodować zamieszanie dla początkujących JS, takich jak ja, tj. Co robić wewnątrzif
.Począwszy od JavaScript 1.8.5, można użyć,
Object.keys(obj)
aby uzyskać tablicę właściwości zdefiniowanych w samym obiekcie (tych, które zwracają wartość trueobj.hasOwnProperty(key)
).Jest to lepsze (i bardziej czytelne) niż użycie pętli for-in.
Jest obsługiwany w tych przeglądarkach:
Zobacz Mozilla Developer Network Object.keys () „s odniesienia w celu uzyskania dalszych informacji.
źródło
Object.keys(myObject).forEach(function(key,index) { //key = the name of the object key //index = the ordinal position of the key within the object });
for candidate in candidateStatus
... wydaje mi się czytelnyDziewczęta i chłopaki, jesteśmy w 2019 roku i nie mamy zbyt wiele czasu na pisanie ... Zróbmy więc ten nowy, fajny nowy ECMAScript 2016:
źródło
obj=window.performance.memory
: - / Where asfor in
does. tj.var obj = window.performance.memory; for( key in obj ) console.log( 'key=' + key + ' val=' + obj[key] );
window.performance.memory
jest obsługiwany tylko przez chrome iObject.keys(obj)
zwraca pustą tablicę. To nie ma nic wspólnego.map
.e
, opublikowałem tę treść. Zasadniczo jest tak, jak większość implementacji skrótu i używa(
(key)
=>
(value)
)
zamiast niego{
key
=>
value
}
, ale jeśli wcześniej nie musiałeśJest to
for...in statement
( MDN , specyfikacja ECMAScript ).Można go odczytać jako „ za każdym własności W tym
obj
obiekcie, przypisać każdy obiekt do PROPT zmiennej z kolei”.źródło
in
operatora ifor
oświadczenia nie są zaangażowane w tym wszystkim,for-in
zestawienie przedstawia produkcję gramatyki na własną rękę:for ( LeftHandSideExpression in Expression )
,for ( var VariableDeclarationNoIn in Expression )
W aktualnych implementacjach ES możesz użyć
Object.entries
:lub
Jeśli chcesz po prostu iterować po wartościach, użyj Object.values:
lub
źródło
To tylko
for...in
pętla. Sprawdź dokumentację w Mozilli .źródło
Jeśli twoje środowisko obsługuje ES2017 , poleciłbym Object.entries :
Jak pokazano w dokumentacji Mozillas Object.entries () :
Zasadniczo za pomocą Object.entries możemy zrezygnować z następującego dodatkowego kroku, który jest wymagany w przypadku starszych pętli for ... in :
źródło
jquery pozwala teraz to zrobić:
źródło
$.each({foo:1, length:0, bar:2}, function(k,v){console.log(k,v)})
$ .each nie jest odpowiedni dla obiektów. Jeśli obiekt ma właściwość length, a jego wartość wynosi zero, cały obiekt jest traktowany tak, jakby był pustą tablicą.Odpowiedź Dominika jest idealna, po prostu wolę to zrobić w ten sposób, ponieważ łatwiej jest przeczytać:
źródło
Object
z wielkimi literami o, nie?Powyższe odpowiedzi są nieco irytujące, ponieważ nie wyjaśniają, co robisz wewnątrz pętli for po upewnieniu się, że jest to obiekt: NIE DOSTĘPUJEŚ BEZPOŚREDNIO! W rzeczywistości dostarczono tylko KLUCZ, który należy złożyć do OBJ:
To wszystko jest bezpieczne dla ECMA5. Działa nawet w kiepskich wersjach JS, takich jak Rhino;)
źródło
Aby dodać użycie ES2015
Reflect.ownKeys(obj)
a także iterację właściwości za pomocą iteratora.Na przykład:
można powtórzyć przez
Jeśli chcesz iterować bezpośrednio po wartościach kluczy obiektu, możesz zdefiniować
iterator
, podobnie jak domyślne iteratory JavaScipts dla łańcuchów, tablic, tablic maszynowych, mapy i zestawu.JS spróbuje wykonać iterację za pomocą domyślnej właściwości iteratora, którą należy zdefiniować jako
Symbol.iterator
.Jeśli chcesz mieć możliwość iteracji po wszystkich obiektach, możesz dodać go jako prototyp obiektu:
Umożliwiłoby to iterację wartości obiektu z pętlą for ..., na przykład:
Uwaga : w momencie pisania tej odpowiedzi (czerwiec 2018 r.) Wszystkie inne przeglądarki, ale IE, obsługują generatory i
for...of
iterację za pośrednictwemSymbol.iterator
źródło
źródło
forEach
pomijam puste wartości , myślę, że możesz pozbyć się odpowiedzi „jeśli i po prostu”, takObject.keys(obj).forEach(e => console.log(`key=${e} value=${obj[e]}`));
jak Frank.Pętla for ... reprezentuje każdą właściwość w obiekcie, ponieważ jest ona jak pętla for. Zdefiniowałeś propt w pętli for ... wykonując:
Pętla for ... iteruje iterowalne wyliczalne właściwości obiektu. Każda zmienna, którą zdefiniujesz lub umieścisz w pętli for ..., zmienia się za każdym razem, gdy przechodzi do następnej iterowanej właściwości. Zmienna w pętli for ... in iteruje przez klucze, ale jej wartość jest wartością klucza. Na przykład:
Możesz zobaczyć, jak zmienna różni się od wartości zmiennej. Natomiast pętla for ... robi coś przeciwnego.
Mam nadzieję, że to pomoże.
źródło
źródło
forEach
bardziej odpowiednie jest tutaj, ponieważmap
ma na celu zwrócenie nowej tablicy z wynikami wywoływania bloku kodu przy każdej iteracji. Ale interesują nas tylko skutki uboczne każdej iteracji, a nie wartość zwracana, dlatego nie potrzebujemy nowej tablicy, któramap
nam daje.źródło
Możesz użyć Lodash. Dokumentacja
źródło
Twoja
for
pętla iteruje wszystkie właściwości obiektuobj
.propt
jest zdefiniowany w pierwszym wierszu pętli for. Jest to ciąg znaków, który jest nazwą właściwościobj
obiektu. W pierwszej iteracji pętlipropt
będzie to „name”.źródło
Obiekty w JavaScript są kolekcjami właściwości i dlatego mogą być zapętlone dla każdej instrukcji.
Powinieneś pomyśleć o
obj
kolekcji kluczowych wartości.źródło
Obecnie można przekształcić standardowy obiekt JS w obiekt iterowalny, dodając metodę Symbol.iterator. Następnie możesz użyć
for of
pętli i uzyskać dostęp do jej wartości bezpośrednio, a nawet użyć operatora rozkładania na obiekcie. Fajne. Zobaczmy, jak możemy to zrobić:źródło
function*
odkrycie!Jeśli korzystam z Węzła , polecam:
źródło
Chociaż najwyżej oceniana odpowiedź jest poprawna, oto alternatywny przypadek użycia, tzn. Jeśli iterujesz obiekt i chcesz na końcu utworzyć tablicę. Użyj
.map
zamiastforEach
źródło
Dodając również sposób rekurencyjny:
Stosowanie:
źródło
Pętla for..in tworzy nową zmienną (var someVariable), a następnie przechowuje każdą właściwość danego obiektu w tej nowej zmiennej (someVariable) jedna po drugiej. Dlatego jeśli użyjesz bloku {}, możesz iterować. Rozważ następujący przykład.
źródło
obj[someVariable]
. Być może powodem, dla którego tak bardzo go oceniano, jest to, że nie jest rekurencyjny. Nie byłoby to odpowiednie rozwiązanie, jeśli masz obiekt o bardzo dobrej strukturze.Tutaj iteruję każdy węzeł i tworzę znaczące nazwy węzłów. Jeśli zauważysz, instanceOf Array i instanceOf Object właściwie robi to samo (w mojej aplikacji podaję jednak inną logikę)
uwaga - inspiruje mnie odpowiedź Ondreja Svejdara. Ale to rozwiązanie ma lepszą wydajność i mniej niejednoznaczne
źródło
Zasadniczo chcesz zapętlić każdą właściwość w obiekcie.
JSFiddle
źródło
obj(prop)
<- TypeError: obj nie jest funkcjąhasOwnProperty
atrybut. Powinno już działać.Chcę dodać do powyższych odpowiedzi, ponieważ możesz mieć inne zamiary niż JavaScript. Obiekt JSON i obiekt JavaScript to różne rzeczy, więc możesz iterować właściwości JSON, korzystając z rozwiązań zaproponowanych powyżej, a następnie być zaskoczonym.
Załóżmy, że masz obiekt JSON, taki jak:
Niewłaściwy sposób iteracji poprzez „właściwości”:
Możesz być zaskoczony widząc rejestrowanie konsoli
0
,1
itd gdy iteracja właściwościprop1
iprop2
iprop3_1
. Te obiekty są sekwencjami, a indeksy sekwencji są właściwościami tego obiektu w JavaScript.Lepszym sposobem na rekurencyjne iterowanie właściwości obiektu JSON byłoby najpierw sprawdzenie, czy ten obiekt jest sekwencją, czy nie:
źródło
Aby jeszcze bardziej zawęzić zaakceptowaną odpowiedź, warto zauważyć, że jeśli utworzysz obiekt za pomocą
var object = Object.create(null)
a,object.hasOwnProperty(property)
to spowoduje wystąpienie błędu typu. Aby być bezpiecznym, musisz wywołać go z prototypu w następujący sposób:źródło
Sprawdź ten link, pomoże to https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_state_forin
źródło