W JavaScript utworzyłem taki obiekt:
var data = {
'PropertyA': 1,
'PropertyB': 2,
'PropertyC': 3
};
Czy można dodać kolejne właściwości do tego obiektu po jego początkowym utworzeniu, jeśli nazwa właściwości nie zostanie określona do czasu uruchomienia? to znaczy
var propName = 'Property' + someUserInput
//imagine someUserInput was 'Z', how can I now add a 'PropertyZ' property to
//my object?
javascript
Lee D.
źródło
źródło
object["property"]
nie jest dokładnie taki sam, jakarray[4]
ten pierwszy nie został stworzony jako prawdziwa tablica.data["PropertyD"]
dodata[function_to_get_property_name()]
wydaje się trywialne.ES6 na zwycięstwo!
Jeśli się zalogujesz
data
, otrzymasz:Wykorzystuje to nową składnię właściwości obliczonych i literały szablonów .
źródło
obj[propname]
). Zamiast tego mogłem użyć tego ze składnią rozproszenia obiektów.var a = {}; a["dynamic-" + prop] = true;
a
. (Szczególnie przy użyciu pakietów takich jak redux)Tak to mozliwe. Zarozumiały:
Zarówno:
lub
Pierwsza metoda jest preferowana. eval () ma oczywiste obawy dotyczące bezpieczeństwa, jeśli używasz wartości dostarczonych przez użytkownika, więc nie używaj go, jeśli możesz tego uniknąć, ale warto wiedzieć, że istnieje i co może zrobić.
Możesz odwołać się do tego za pomocą:
lub
lub
źródło
$("#mySelector").data("propertyname", myvalue);
na ustawieniu ivar myValue=$("#mySelector").data("propertyname");
odzyskaniu wartości. W ten sposób można dodawać nawet złożone obiekty (listy, tablice ...).Wiem, że odpowiedź na to pytanie jest idealna, ale znalazłem też inny sposób na dodanie nowych właściwości i chciałem się z tobą podzielić:
Możesz użyć tej funkcji
Object.defineProperty()
Znaleziono w Mozilla Developer Network
Przykład:
źródło
defineProperties
(liczba mnoga).Object.defineProperty
nie ma być łatwym narzędziem wygody, ale tym z precyzyjną kontrolą. Jeśli nie potrzebujesz tej dodatkowej kontroli, nie jest to właściwe narzędzie do wyboru.Object.defineProperty(obj, prop, valueDescriptor)
jest znacznie wolniejszy i trudniejszy do zoptymalizowania dla V8 niż po prostu robienieobj[prop] = value
;ES6 wprowadza obliczone nazwy właściwości, które pozwalają ci to zrobić
źródło
Tutaj, używając notacji:
źródło
Możesz dodać dowolną liczbę dodatkowych właściwości, korzystając z notacji kropkowej:
lub :
dla kluczy dynamicznych.
źródło
oprócz wszystkich poprzednich odpowiedzi, a jeśli zastanawiasz się, w jaki sposób będziemy pisać dynamiczne nazwy właściwości w przyszłości za pomocą obliczonych nazw właściwości (ECMAScript 6), oto jak to zrobić :
odniesienie: Zrozumienie ECMAScript 6 - Nickolas Zakas
źródło
Tylko dodatek do powyższej odpowiedzi Abeinga. Możesz zdefiniować funkcję, aby zawrzeć złożoność definicji właściwości, jak wspomniano poniżej.
odniesienie: http://addyosmani.com/resources/essentialjsdesignpatterns/book/#constructorpatternjavascript
źródło
Możesz dynamicznie dodawać właściwości za pomocą niektórych z poniższych opcji:
W twoim przykładzie:
Możesz zdefiniować właściwość o wartości dynamicznej na dwa następujące sposoby:
lub
Co więcej ... jeśli twój klucz jest również dynamiczny, możesz zdefiniować za pomocą klasy Object:
gdzie dane są twoim obiektem, klucz jest zmienną do przechowywania nazwy klucza, a wartość jest zmienną do przechowywania wartości.
Mam nadzieję, że to pomoże!
źródło
Wiem, że istnieje już kilka odpowiedzi na ten post, ale nie widziałem żadnej, w której istnieje wiele właściwości i są one w tablicy. Nawiasem mówiąc, to rozwiązanie jest dla ES6.
Na przykład załóżmy, że mamy tablicę o nazwie osoba z obiektami w środku:
Możesz więc dodać właściwość o odpowiedniej wartości. Powiedzmy, że chcemy dodać język z domyślną wartością EN .
Osoba tablica teraz stanie się to tak:
źródło
Person = Person.map(code here)
. Ale chodzi o to, że możesz łatwo dodać właściwość do istniejącego obiektu za pomocąES6
.Najprostszym i najbardziej przenośnym sposobem jest.
Na podstawie odpowiedzi #abeing!
źródło
Zachowaj ostrożność podczas dodawania właściwości do istniejącego obiektu za pomocą metody . (Kropka) .
(.dot) metoda dodawania właściwości do obiektu powinna być używana tylko wtedy, gdy znasz wcześniej „klucz”, w przeciwnym razie użyj metody [bracket] .
Przykład:
Zwróć uwagę na problem na końcu dziennika konsoli - „klucz: 1999” zamiast właściwości 6: 6, właściwości 7: 7, ........., właściwości 1999: 1999 . Zatem najlepszym sposobem dodawania dynamicznie tworzonej właściwości jest metoda [bracket].
źródło
Dobry sposób na dostęp z dynamicznych nazw ciągów zawierających obiekty (na przykład object.subobject.property)
Przykład:
eval działa na wartość odczytu, ale wartość zapisu jest nieco trudniejsza.
Bardziej zaawansowana wersja (Utwórz podklasy, jeśli nie istnieją i zezwala na obiekty zamiast zmiennych globalnych)
Przykład:
Jest to to samo, co o.object.subobject.property
źródło
Oto jak rozwiązałem problem.
Generuje następujący obiekt:
źródło
Może być przydatny, jeśli w środowisku wykonawczym dodano nowe mieszane właściwości:
Jednak operator rozprzestrzeniania używa płytkiej kopii, ale tutaj przypisujemy sobie dane, więc nic nie powinno stracić
źródło
Idealny łatwy sposób
Jeśli chcesz zastosować go do tablicy danych (wersja ES6 / TS)
źródło
Zdecydowanie. Pomyśl o tym jak o słowniku lub tablicy asocjacyjnej. Możesz dodać do niego w dowolnym momencie.
źródło