Próbuję uzyskać dostęp do właściwości obiektu przy użyciu nazwy dynamicznej. czy to możliwe?
const something = { bar: "Foobar!" };
const foo = 'bar';
something.foo; // The idea is to access something.bar, getting "Foobar!"
javascript
object
properties
RichW
źródło
źródło
Odpowiedzi:
Istnieją dwa sposoby uzyskania dostępu do właściwości obiektu:
something.bar
something['bar']
Wartość w nawiasach kwadratowych może być dowolnym wyrażeniem. Dlatego jeśli nazwa właściwości jest przechowywana w zmiennej, musisz użyć notacji nawiasowej:
źródło
To jest moje rozwiązanie:
Przykłady użycia:
źródło
W javascript możemy uzyskać dostęp za pomocą:
foo.bar
foo[someVar]
lubfoo["string"]
Ale tylko drugi przypadek pozwala na dynamiczny dostęp do właściwości:
źródło
Poniżej znajduje się przykład ES6, w jaki sposób można uzyskać dostęp do właściwości obiektu za pomocą nazwy właściwości, która została dynamicznie wygenerowana przez połączenie dwóch łańcuchów.
Nazywa się to obliczonymi nazwami właściwości
źródło
Możesz to osiągnąć na kilka różnych sposobów.
Notacja w nawiasie jest szczególnie wydajna, ponieważ umożliwia dostęp do właściwości opartej na zmiennej:
Można to rozszerzyć na zapętlenie każdej właściwości obiektu. Może to wydawać się zbędne ze względu na nowsze konstrukcje JavaScript, takie jak ... z ..., ale pomaga zilustrować przypadek użycia:
Zarówno notacja kropkowa jak i nawiasowa działają również zgodnie z oczekiwaniami dla zagnieżdżonych obiektów:
Niszczenie obiektów
Możemy również rozważyć destrukcję obiektu jako sposób dostępu do właściwości w obiekcie, ale w następujący sposób:
źródło
Możesz to zrobić za pomocą Lodash get
źródło
AKTUALIZACJA
Uwzględniłem poniższe uwagi i zgodziłem się. Ewaluacji należy unikać.
Łatwo można uzyskać dostęp do właściwości katalogu głównego w obiekcie
obj[variable]
, ale zagnieżdżenie komplikuje sprawę. Nie pisać już napisanego kodu, którego sugeruję użyćlodash.get
.Przykład
Z Lodash get można korzystać na różne sposoby, tutaj jest link do dokumentacji lodash.get
źródło
eval
gdy tylko jest to możliwe. stackoverflow.com/questions/86513/…eval
czegoś tak trywialnego, jak dostęp do właściwości, jest zwykłym przesadą i nie jest zalecane w żadnych okolicznościach. Co to za „kłopoty”?obj['nested']['test']
działa bardzo dobrze i nie wymaga osadzania kodu w łańcuchach.obj['nested']['value']
- pamiętajcie dzieci, eval jest złe!_.get
do stołu. Myślę, że ta odpowiedź zasługuje teraz na głosowanie zamiast głosowania negatywnego. Może to być przesada, ale dobrze wiedzieć, że istnieje.Ilekroć potrzebujesz dynamicznego dostępu do właściwości, musisz użyć nawiasu kwadratowego, aby uzyskać dostęp do właściwości, a nie „.” operator
Składnia: obiekt [propery}
źródło
Natknąłem się na przypadek, w którym myślałem, że chcę przekazać „adres” właściwości obiektu jako dane do innej funkcji i zapełnić obiekt (za pomocą AJAX), wyszukać z tablicy adresów i wyświetlić w tej innej funkcji. Nie mogłem używać notacji kropkowej bez robienia akrobatyki łańcuchowej, więc pomyślałem, że tablica może być miło przekazać Skończyło się na zrobieniu czegoś innego, ale wydawało mi się, że jestem związany z tym postem.
Oto przykład obiektu pliku językowego, takiego jak ten, z którego chciałem uzyskać dane:
Chciałem móc przekazać tablicę, taką jak: [„audioPlayer”, „kontroluje”, „stop”], aby uzyskać dostęp do tekstu języka, w tym przypadku „stop”.
Stworzyłem tę małą funkcję, która wyszukuje „najmniej konkretny” (pierwszy) parametr adresu i ponownie przypisuje zwracany obiekt do siebie. Następnie jest gotowy wyszukać najbardziej szczegółowy parametr adresu, jeśli taki istnieje.
stosowanie:
źródło
To staje się interesujące, gdy musisz przekazać parametry również do tej funkcji.
Kod jsfiddle
źródło
ES5 // Sprawdź głęboko zagnieżdżone zmienne
Ten prosty fragment kodu może sprawdzić głęboko zagnieżdżone istnienie zmiennych / wartości bez konieczności sprawdzania każdej zmiennej po drodze ...
Dawny. - głęboko zagnieżdżona tablica obiektów:
Zamiast :
Możemy teraz:
Twoje zdrowie!
źródło
Function
zamiast tego używaćZadałem pytanie, które trochę powielało ten temat jakiś czas temu, a po nadmiernych badaniach i widząc wiele brakujących informacji, które powinny tu być, czuję, że mam coś cennego do dodania do tego starszego postu.
jednak rzadko wybieram tę trasę, ponieważ nie działa ona na wartości właściwości przypisane za pomocą arkuszy stylów. Jako przykład podam przykład z pseudo-kodem.
Korzystając z powyższego przykładu kodu; jeśli właściwość width elementu div, który był przechowywany w zmiennej „elem”, została stylizowana w arkuszu stylów CSS, a nie w jej znaczniku HTML, bez wątpienia otrzymasz zwrot wartości niezdefiniowanej przechowywanej w środku zmiennej cssProp. Nieokreślona wartość występuje, ponieważ aby uzyskać poprawną wartość, kod zapisany w arkuszu stylów CSS musi zostać obliczony w celu uzyskania wartości; musisz użyć metody, która obliczy wartość właściwości, której wartość leży w arkuszu stylów.
W3Schools getComputedValue Doc Daje to dobry przykład i pozwala się z nim bawić, jednak ten link Mozilla CSS getComputedValue doc mówi szczegółowo o funkcji getComputedValue i powinien być czytany przez każdego początkującego programistę, który nie jest do końca jasny na ten temat.
... dostaje i ustawia. To jest to, czego używam, jedynym minusem jest to, że znasz JQuery, ale jest to szczerze jeden z wielu dobrych powodów, dla których każdy programista Javascript powinien uczyć się JQuery, ułatwia życie i oferuje metody, takie jak ta, która nie jest dostępny ze standardowym Javascript. Mam nadzieję, że to komuś pomoże !!!
źródło
Dla każdego, kto chce ustawić wartość zagnieżdżonej zmiennej, oto jak to zrobić:
Dokumentacja: https://lodash.com/docs/4.17.15#set
Ponadto dokumentacja, jeśli chcesz uzyskać wartość: https://lodash.com/docs/4.17.15#get
źródło
Powinieneś użyć
JSON.parse
, spójrz na https://www.w3schools.com/js/js_json_parse.aspźródło
źródło
foo
jest już ciągiem, więc`${foo}`
jest dokładnie taki sam jakfoo
. (Poza tym twój kod wydaje się zawierać dodatkowe ukośniki odwrotne, które tam nie należą. Ale i tak byłby bezcelowy, nawet jeśli naprawiłeś ten błąd składniowy.)