Jaki jest najlepszy / standardowy sposób łączenia dwóch tablic asocjacyjnych w JavaScript? Czy każdy po prostu robi to, obracając własną for
pętlę?
javascript
object
Wilhelm
źródło
źródło
Odpowiedzi:
z jQuery możesz zadzwonić
$.extend
(asoc. tablice są obiektami w js)
spójrz tutaj: http://api.jquery.com/jQuery.extend/
edycja: Jak sugerował rymo, lepiej zrobić to w ten sposób:
Tak jak tutaj obj1 (i obj2) pozostają niezmienione.
edit2: W 2018 roku można to zrobić poprzez
Object.assign
:Jeśli pracujesz z ES6, można to osiągnąć za pomocą operatora rozprzestrzeniania :
źródło
obj1
, użyj pustego obiektu jako celu:$.extend({}, obj1, obj2)
Object.assign()
, które nie polega na JQuery, jeśli nie używasz jeszcze biblioteki.Teraz, w 2016 roku, powiedziałbym, że najlepszym / standardowym sposobem jest Object. assign ()
Pure Javascript. Nie jest potrzebne jQuery.
Więcej informacji, przykładów i polyfill tutaj: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/ assign
źródło
Tak to robi Prototype:
nazywany na przykład:
EDYCJA : dodano kontrolę hasOwnProperty (), jak poprawnie wskazał bucabay w komentarzach
źródło
Nie komplikuj...
źródło
arrau1.prototype
hasOwnProperty
czeku. Odwołując się do obiektów, ponieważ tablice również wprowadzają w błąd (są to obiekty), nazwy argumentów powinny wskazywać, że tablica2 jest zmutowana lub że należy zwrócić nowy obiekt. Zmieniłbym odpowiedź, ale w efekcie stałaby się ona prawie dokładnie zredagowaną odpowiedzią Jonathana Finglanda, która została już poprawiona.Podkreślenie ma również metodę rozszerzania:
źródło
W dojo „scalanie” 2 obiektów / tablic wyglądałoby następująco
lang.mixin(destination, source)
- możesz także mieszać wiele źródeł w jednym miejscu docelowym itp. - szczegóły znajdziesz w opisie funkcji mixin .źródło
czy chcesz nadpisać właściwość, jeśli nazwy są takie same, ale wartości nie?
Czy chcesz trwale zmienić jeden z oryginalnych obiektów,
czy chcesz, aby nowy scalony obiekt został zwrócony?
źródło
Rolling własną wysuwania / mixin funkcji
...
...
To po prostu rekurencyjnie rozciąga zbiór obiektów. Należy również zauważyć, że ta rekurencyjna funkcja to TCO ( Tail-Call Optimized ), ponieważ jej zwrot jest ostatnim wywołaniem samej siebie.
Ponadto możesz chcieć wybrać właściwości docelowe . W tym przypadku, można skondensować obiektów w oparciu
id
,quantity
lub innego mienia. Takie podejście może wymagać napisania małej książki, wymaga zestawienia obiektów i może być bardzo złożone. Napisałem do tego małą bibliotekę, która jest dostępna na żądanie.Mam nadzieję że to pomoże!
źródło
źródło
W 2019 roku masz 2 dobre opcje:
Przypisywanie obiektów [ doc ]
Rozprzestrzenianie obiektów [ doc ]
Pierwszy z nich wydaje się być bezpieczniejszy, bardziej standardowy i wszechstronny. A dobre plusy i minusy tutaj
źródło
Yahoo UI (YUI) ma również do tego funkcję pomocniczą:
http://developer.yahoo.com/yui/examples/yahoo/yahoo_merge.html
źródło
jquery ma wartość logiczną dla głębokiego kopiowania. Możesz zrobić coś takiego:
Możesz również edytować tę funkcję, aby obsługiwała n-tablice do scalania.
Więc teraz możesz to zrobić
źródło
Potrzebowałem głębokiego scalania obiektów. Więc wszystkie inne odpowiedzi nie pomogły mi zbytnio. _.extend i jQuery.extend radzą sobie dobrze, chyba że masz tablicę rekurencyjną, tak jak ja. Ale nie jest tak źle, możesz to zaprogramować w pięć minut:
źródło
Aby scalić tablice w jQuery, a co z $ .merge?
źródło
Rozwiązanie rekurencyjne (rozszerza również tablice obiektów) + zaznaczenie null
Testy
źródło
Object.getOwnPropertyNames is not a function
aplikacja uległa awarii.Oto najlepsze rozwiązanie.
Ponadto,
obj1
mogą rosnąć wewnątrz pętli bez żadnego problemu. (powiedzmy, żeobj2
jest dynamiczny)źródło