Oto dosłownie mój obiekt:
var obj = {key1: value1, key2: value2};
Jak mogę dodać pole key3
z value3
do obiektu?
javascript
object-literal
James Skidmore
źródło
źródło
Odpowiedzi:
Istnieją dwa sposoby dodawania nowych właściwości do obiektu:
Za pomocą notacji kropkowej:
Za pomocą notacji w nawiasach kwadratowych:
Pierwszy formularz jest używany, gdy znasz nazwę właściwości. Druga forma jest używana, gdy nazwa właściwości jest określana dynamicznie. Jak w tym przykładzie:
Rzeczywistym Tablica JavaScript może być wykonana przy użyciu:
Dosłowna notacja Array:
Notacja konstruktora macierzy:
źródło
Object.keys({"b": 1, "c": 3, "a": 2}).sort().forEach(console.log);
length
właściwość nie jest ustawiona, ponieważ nie jest to tablica, to obiekt / mapa / słownik.Odpowiedź na rok 2017:
Object.assign()
Object.assign (dest, src1, src2, ...) łączy obiekty.
Zastępuje
dest
właściwości i wartości (jakkolwiek wielu) obiektów źródłowych, a następnie zwracadest
.Przykład na żywo
Odpowiedź na rok 2018: operator rozkładania obiektów
{...}
Z MDN :
Przykład na żywo
Działa w bieżącym Chrome i aktualnym Firefoksie. Mówią, że nie działa w obecnym Edge.
Odpowiedź na rok 2019
Operator przypisania obiektu+=
:Ups ... Zostałem uniesiony. Informacje o przemycie z przyszłości są nielegalne. Właściwie zasłonięty!źródło
const
alet
zamiast tegovar
, czy powinien to być sposób na 2018 rok?const
ponieważ usuwa tę zaletę. Za każdym razem, gdy go używałem, hamował rozwój.Year 2019 answer ... Opps ...
część zasługuje na Dziękuję, uczyniłaś mój dzień . Najlepsza odpowiedź +1Mam uprawianych fond LoDash / podkreślenia przy pisaniu większych projektów.
Dodawanie przez
obj['key']
lubobj.key
wszystkie są czystymi odpowiedziami w języku JavaScript. Jednak zarówno biblioteki LoDash, jak i Underscore zapewniają wiele dodatkowych wygodnych funkcji podczas ogólnej pracy z obiektami i tablicami..push()
jest dla tablic , a nie dla obiektów .W zależności od tego, czego szukasz, istnieją dwie konkretne funkcje, które mogą być przyjemne w użyciu i dają funkcjonalność podobną do odczucia
arr.push()
. Aby uzyskać więcej informacji, sprawdź dokumenty, mają tam świetne przykłady._.merge (tylko Lodash)
Drugi obiekt nadpisze lub doda do obiektu podstawowego.
undefined
wartości nie są kopiowane._.extend / _.ignign
Drugi obiekt nadpisze lub doda do obiektu podstawowego.
undefined
zostanie skopiowany._.defaults
Drugi obiekt zawiera wartości domyślne, które zostaną dodane do obiektu podstawowego, jeśli nie istnieją.
undefined
wartości zostaną skopiowane, jeśli klucz już istnieje.$ .extend
Ponadto warto wspomnieć o jQuery.extend, działa podobnie do _.merge i może być lepszą opcją, jeśli już używasz jQuery.
Drugi obiekt nadpisze lub doda do obiektu podstawowego.
undefined
wartości nie są kopiowane.Object.assign ()
Warto wspomnieć o obiekcie ES6 / ES2015 Object.assign, działa on podobnie do _.merge i może być najlepszą opcją, jeśli już używasz wielopełniacza ES6 / ES2015, takiego jak Babel, jeśli chcesz sam się wypełnić .
Drugi obiekt nadpisze lub doda do obiektu podstawowego.
undefined
zostanie skopiowany.źródło
_.extend
to bardziej uniwersalny alias, ponieważ biblioteka podkreślania wciąż goextend
nie używamerge
. Zaktualizuję moją odpowiedź.Możesz użyć jednego z nich (pod warunkiem, że key3 jest kluczem, którego chcesz użyć)
lub
Jeśli key3 jest zmienną, powinieneś zrobić:
Po tym żądanie
arr.a_key
zwróci wartośćvalue3
literału3
.źródło
ponieważ twoja tablica nie jest tak naprawdę tablicą ... To obiekt prototypowy. Rzeczywista tablica to:
ale nadal nie jest w porządku. W rzeczywistości powinno to być:
źródło
źródło
Po prostu dodając właściwości:
I chcemy dodać
prop2 : 2
do tego obiektu, są to najwygodniejsze opcje:object.prop2 = 2;
object['prop2'] = 2;
Więc którego używamy?
Operator kropki ma bardziej przejrzystą składnię i powinien być używany jako domyślny (imo). Jednak operator kropki nie jest w stanie dodać dynamicznych kluczy do obiektu, co może być bardzo przydatne w niektórych przypadkach. Oto przykład:
Scalanie obiektów:
Kiedy chcemy scalić właściwości 2 obiektów, są to najwygodniejsze opcje:
Object.assign()
, bierze obiekt docelowy za argument i jeden lub więcej obiektów źródłowych i scali je razem. Na przykład:...
Z którego korzystamy?
Object.assign()
jest bardziej dynamiczny, ponieważ mamy dostęp do wszystkich obiektów, które są przekazywane jako argumenty i możemy nimi manipulować, zanim zostaną przypisane do nowego obiektu.źródło
Wiem, że istnieje już zaakceptowana odpowiedź na to pytanie, ale pomyślałem, że gdzieś udokumentuję swój pomysł. Proszę [ludzie] śmiać się z dziurami w tym pomyśle, ponieważ nie jestem pewien, czy jest to najlepsze rozwiązanie ... ale po prostu złożyłem to kilka minut temu:
Użyłbyś tego w ten sposób:
Ponieważ funkcja prototypu powraca
this
, możesz kontynuować tworzenie łańcucha.push
do końcaobj
zmiennej:obj.push(...).push(...).push(...);
Inną cechą jest to, że możesz przekazać tablicę lub inny obiekt jako wartość w argumentach funkcji push. Zobacz mój skrzypce dla działającego przykładu: http://jsfiddle.net/7tEme/
źródło
TypeError: 'undefined' is not a function (evaluating 'U[a].exec(s)')
co jest dziwne, ponieważ działa w jsfiddle nawet z jquery1.9Wydajność
Dzisiaj 2020.01.14 Przeprowadzam testy na MacOs HighSierra 10.13.6 na Chrome v78.0.0, Safari v13.0.4 i Firefox v71.0.0 dla wybranych rozwiązań. Dzielę rozwiązania na zmienne (pierwsza litera M) i niezmienne (pierwsza litera I). Podaję także kilka niezmiennych rozwiązań (IB, IC, ID / IE), które nie zostały jeszcze opublikowane w odpowiedziach na to pytanie
Wnioski
obj.key3 = "abc"
(MA, MB), jest najszybsze{...obj, key3:'abc'}
iObject.assign
(IA, IB) są najszybszeDetale
W poniższym fragmencie znajduje się wstępnie przetestowane rozwiązanie, które można przetestować na swoim komputerze TUTAJ
Pokaż fragment kodu
źródło
Możesz stworzyć zajęcia z odpowiedzią @ Ionuț G. Stan
Tworzenie nowego obiektu za pomocą ostatniej klasy:
Drukowanie obiektu
Drukowanie klucza
Jestem nowicjuszem w javascript, komentarze są mile widziane. Pracuje dla mnie.
źródło
Dwa najczęściej używane sposoby wspomniane już w większości odpowiedzi
Jeszcze jednym sposobem na zdefiniowanie właściwości jest użycie Object.defineProperty ()
Ta metoda jest przydatna, gdy chcesz mieć większą kontrolę podczas definiowania właściwości. Zdefiniowana właściwość może być ustawiona przez użytkownika jako wymienna, konfigurowalna i zapisywalna.
źródło
Twój przykład pokazuje obiekt, a nie tablicę. W takim przypadku preferowanym sposobem dodania pola do obiektu jest po prostu przypisanie mu takiego pola:
źródło
obsługiwany przez większość przeglądarek i sprawdza, czy klucz obiektu jest dostępny, czy nie chcesz go dodać, jeśli jest dostępny , zastępuje istniejącą wartość klucza i nie jest dostępny , dodaje klucz z wartością
Przykład 1
przykład 2
przykład 3
źródło
Jeśli masz wiele anonimowych literałów obiektów w obiekcie i chcesz dodać kolejny obiekt zawierający pary klucz / wartość, wykonaj następujące czynności:
Firebug 'the Object:
zwroty:
Kod:
doda
Object {name="Peanuts", value="12"}
do obiektu Comicbookźródło
Albo
obj['key3'] = value3
alboobj.key3 = value3
doda nową parę doobj
.Wiem jednak, że jQuery nie było wspomniane, ale jeśli go używasz, możesz dodać obiekt
$.extend(obj,{key3: 'value3'})
. Na przykład:jQuery. przedłużenie (cel [, obiekt1] [, objectN]), łączy się zawartość dwóch lub więcej obiektów razem do pierwszego obiektu.
Pozwala także na rekursywne dodawanie / modyfikowanie za pomocą
$.extend(true,object1,object2);
:Pokaż fragment kodu
źródło
Krótki i elegancki sposób w następnej specyfikacji Javascript (etap 3 kandydata) to:
obj = { ... obj, ... { key3 : value3 } }
Głębszą dyskusję można znaleźć w Object spread vs. Object.assign oraz na stronie Dr. Axela Rauschmayersa .
Działa już w node.js od wersji 8.6.0.
Vivaldi, Chrome, Opera i Firefox w aktualnych wydaniach również znają tę funkcję, ale Mirosoft dopiero dziś, ani w Internet Explorerze, ani w Edge.
źródło
Dane wyjściowe takie jak: -
źródło
Możesz dodać go w ten sposób:
lub w ten sposób:
Odpowiedzi sugerujące wprowadzenie do obiektu za pomocą zmiennej
key3
działałyby tylko wtedy, gdyby wartość parametrukey3
było'key3'
.źródło
Według Accessory Accessors zdefiniowanych w ECMA-262 ( http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf , P67) istnieją dwa sposoby dodawania właściwości do istnieje obiekt. Wszystkie te dwa sposoby, silnik JavaScript potraktuje je tak samo.
Pierwszym sposobem jest użycie notacji kropkowej:
Ale w ten sposób powinieneś użyć IdentifierName po notacji kropkowej.
Drugim sposobem jest użycie notacji nawiasowej:
i inna forma:
W ten sposób możesz użyć wyrażenia (w tym IdentifierName ) w notacji w nawiasie.
źródło
Możemy to zrobić również w ten sposób.
źródło
Ponieważ jest to kwestia przeszłości, ale problem teraźniejszości. Zasugerowałbym jeszcze jedno rozwiązanie: wystarczy przekazać klucz i wartości do funkcji, a otrzymasz obiekt mapy.
źródło
W celu prepend parę klucz-wartość do obiektu, więc w pracach z tego pierwszego elementu to zrobić:
źródło
Najlepszy sposób na osiągnięcie tego samego podano poniżej:
źródło
Możesz utworzyć nowy obiekt, używając
{[key]: value}
składni:W poprzedniej składni możesz teraz używać składni rozszerzonej,
{...foo, ...bar}
aby dodać nowy obiekt bez mutowania starej wartości:źródło