Biorąc pod uwagę przedmiot:
var firstObject = {
key1 : 'value1',
key2 : 'value2'
};
jak mogę skopiować właściwości wewnątrz innego obiektu ( secondObject
) takiego jak ten:
var secondObject = {
key1 : 'value1',
key2 : 'value2',
key3 : 'value3',
key4 : 'value4'
};
za pomocą odniesienia do firstObject
? Coś takiego:
var secondObject = {
firstObject,
key3 : 'value3',
key4 : 'value4'
};
(to nie działa ... Położyłem to, aby pokazać dużymi liniami, jak chciałbym ustrukturyzować kod).
Czy rozwiązanie jest możliwe bez użycia ram JavaScript?
javascript
Igor Popow
źródło
źródło
secondObject = JSON.parse('{' + JSON.stringify(firstObject).match(/^.(.*).$/)[1] + ',' + JSON.stringify(secondObject).match(/^.(.*).$/)[1] + '}');
Odpowiedzi:
źródło
hasOwnProperty
jest bezużyteczny. Chociaż uważam, że twój wskaźnik jest przydatny, uważam, że pomysł zastosowania jakichkolwiek reguł w każdej sytuacji jest szkodliwy i nierozsądny. Podobnie jak wszystkie te praktyki projektowania oparte na wzorcach, które mają miejsce, więc nie bierz tego do siebie…hasOwnProperty()
test i rzeczy nadal działają. Aż się zatrzymają, ponieważ twoje obiekty z czasem stały się bardziej złożone. Z wyjątkiem tego, że tajemniczo pęka w niepowiązanej części kodu, ponieważ zbyt wiele zostało skopiowanych. I nie masz żadnego kontekstu do debugowania. JS jest do bani, więc ostrożne kodowanie, aby zapobiec występowaniu takich problemów, jest rozsądne.Biorąc pod uwagę odpowiedź @ Bardzuśny tutaj, ES6 dostarczył natywne rozwiązanie:
Object.assign()
funkcję!Użycie jest proste:
Otóż to!
Wsparcie w tej chwili jest oczywiście słabe; tylko Firefox (34+) obsługuje go od razu po wyjęciu z pudełka, podczas gdy Chrome (45+) i Opera (32+) wymagają ustawienia „flagi eksperymentalnej”.Wsparcie się poprawia, a najnowsze wersje Chrome, Firefox, Opera, Safari i Edge obsługują go (IE w szczególności nie obsługuje). Dostępne są również transpilery, takie jak Babel i Traceur. Zobacz tutaj po więcej szczegółów.
źródło
Object.assign()
-tylko shim : github.com/ljharb/object.assign ).Na ES6 - Składnia spreadu :
Możesz po prostu użyć:
Pozwala to uniknąć problemów z przekazywaniem tych obiektów przez odniesienie.
Dodatkowo dba o obiekty, które mają głębokie zagnieżdżenie.
źródło
Zapętlaj właściwości pierwszego obiektu i przypisz je do drugiego obiektu:
for
-in
pętli nie jest wystarczająco; trzebahasOwnProperty
. Zobacz http://bonsaiden.github.com/JavaScript-Garden/#object.forinloop, aby uzyskać szczegółowe wyjaśnienie dlaczego.źródło
reference
w sensie technicznym. Myślę, że on po prostu oznacza „odwołujący się” w języku naturalnym.Granie tutaj w nekromantę, ponieważ ES5 przyniosło nam
Object.keys()
możliwość ocalenia nas przed tymi wszystkimi.hasOwnProperty()
czekami.Lub, zawijanie go w funkcję (ograniczona „kopia” lodash
_.assign()
):Object.keys()
jest stosunkowo nową metodą, w szczególności: niedostępną w IE <9. To samo dotyczy.forEach()
metody tablicowej, której użyłem zamiast zwykłejfor
pętli.Na szczęście dla tych starożytnych przeglądarek dostępna jest wersja es5-shim , która wypełni wiele funkcji ES5 (w tym tych dwóch).
(Jestem zwolennikiem wielu wypełniaczy, a nie powstrzymywania się od używania fajnych, nowych funkcji językowych.)
źródło
Necro'ing, aby ludzie mogli znaleźć metodę głębokiego kopiowania z hasOwnProperty i sprawdzaniem rzeczywistych obiektów:
źródło
'[object Array]'
Można użyć Object.assign do łączenia obiektów. Połączy i zastąpi wspólną własność od prawej do lewej, tzn. Ta sama właściwość po lewej stronie zostanie zastąpiona przez prawą.
Ważne jest, aby najpierw podać pusty obiekt, aby uniknąć mutacji obiektów źródłowych. Obiekty źródłowe należy pozostawić czyste, ponieważ
Object.assign()
samo w sobie zwraca nowy obiekt.Mam nadzieję że to pomoże!
źródło
Ulepszenie pomysłu kingPuppy i pomysłu OP (płytka kopia) - dodaję tylko 3 kropki do „przykładu” OP :)
Pokaż fragment kodu
źródło
To powinno działać, przetestowane tutaj .
Uwaga : nie spowoduje to skopiowania metod uwagi
firstObject
2 : do użycia w starszych przeglądarkach potrzebny jest parser json
Uwaga 3 : przypisywanie przez referencję jest realną opcją, szczególnie jeśli
firstObject
zawiera metody. Odpowiednio dostosowałem podany przykład jsfiddleźródło
Niestety nie można umieścić odwołania do zmiennej w takim obiekcie. Można jednak utworzyć funkcję, która kopiuje wartości obiektu do innego obiektu.
źródło
Jeśli chcesz pobrać tylko właściwości istniejące w drugim obiekcie, możesz użyć
Object.keys
do przechwycenia właściwości pierwszego obiektu, możesz wykonać dwie metody:A.),
map
aby przypisać właściwości pierwszego obiektu do drugiego obiektu za pomocą efektów ubocznych:B.) lub
reduce
utworzyć nowy obiekt i przypisać go do drugiego obiektu. Należy pamiętać, że ta metoda zastępuje inne właściwości, które drugi obiekt mógł mieć wcześniej niż te, które nie pasowały do pierwszego obiektu:źródło
Użyj notacji rozprzestrzeniania się właściwości. Został on dodany w ES2018 (spread dla tablic / iterable był wcześniejszy, ES2015), {... firstObject} rozdziela wszystkie wyliczalne właściwości jako własności dyskretne.
źródło
Wolałbym użyć firstObject jako prototypu SecondObject i dodać deskryptor właściwości:
Z pewnością nie jest to jedna linijka, ale daje większą kontrolę. Jeśli jesteś zainteresowany deskryptorami właściwości, sugeruję przeczytać ten artykuł: http://patrickdelancy.com/2012/09/property-descriptors-in-javascript/#comment-2062 oraz stronę MDN https: //developer.mozilla. org / en-US / docs / Web / JavaScript / Reference / Global_Objects / Object / create
Możesz także po prostu przypisać wartości i pominąć deskryptory i uczynić go nieco krótszym:
Kompatybilność: ECMAScript 5, więc IE9 +
źródło
Użycie metody podążania spowoduje skopiowanie właściwości
Jestem bardzo nowy w javascript, ale znalazłem, że działa. Chyba trochę za długo, ale działa.
źródło