Spójrzmy na przykład.
var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
Muszę scalić te 2 tablice obiektów i utworzyć następującą tablicę:
arr3 = new Array({name: "lang", value: "German"}, {name: "age", value: "18"}, {name : "childs", value: '5'});
Czy jest do tego funkcja JavaScript lub jQuery?
$.extend
mi nie pasuje. Wraca
arr4 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
javascript
jquery
arrays
Alexander
źródło
źródło
{name: "lang", value: "English"}
?Odpowiedzi:
Jeśli chcesz połączyć 2 tablice obiektów w JavaScript. Możesz użyć tej jednej sztuczki
Array.prototype.push.apply(arr1,arr2);
Na przykład
Wynik:
źródło
arr1 = arr1.concat(arr2)
concat
zwróci nową tablicę i zepsuje wszelkie posiadane odniesienia.Dzięki ES6 możesz to zrobić bardzo łatwo, jak poniżej:
Wynik:
źródło
{ name: 'lang', value: 'German'}
Dla tych, którzy eksperymentują z nowoczesnymi rzeczami:
źródło
Zaktualizuj 12 października 2019 r
Nowa wersja oparta wyłącznie na nowszym Javascript i bez konieczności korzystania z biblioteki zewnętrznej.
Ta odpowiedź się starzeje, biblioteki takie jak lodash i underscore są obecnie znacznie mniej potrzebne. W nowej wersji tablica docelowa (arr1) jest tą, z którą pracujemy i którą chcemy być na bieżąco. Tablica źródłowa (arr2) to miejsce, z którego pochodzą nowe dane i chcemy, aby zostały scalone z naszą tablicą docelową .
Mamy pętla nad źródłowego tablicy poszukuje nowych danych, a dla każdego obiektu, który nie jest jeszcze w naszym docelowym tablicy po prostu dodać, że obiekt przy target.push (sourceElement) Jeżeli na podstawie naszego mienia kluczowego ( „nazwa”) , obiekt jest już w naszej tablicy docelowej - aktualizujemy jego właściwości i wartości za pomocą Object. assign (targetElement, sourceElement) . Naszym „celem” będzie zawsze ta sama tablica i zaktualizowana zawartość.
Stara odpowiedź za pomocą podkreślenia lub lodash
Zawsze przyjeżdżam tutaj z Google i zawsze nie jestem zadowolony z odpowiedzi. TWOJA odpowiedź jest dobra, ale będzie łatwiej i schludniej, używając podkreślenia.js.
DEMO: http://jsfiddle.net/guya/eAWKR/
Oto bardziej ogólna funkcja, która połączy 2 tablice przy użyciu właściwości ich obiektów. W tym przypadku właściwością jest „nazwa”
źródło
źródło
Bardzo proste przy użyciu operatora rozproszenia ES6:
Merged Array: [ {a: 'HI!'}, {b: 'HOW'} {c: 'ARE'}, {d: 'YOU?'} ]
Uwaga: powyższe rozwiązanie polega na scaleniu dwóch tablic za pomocą operatora rozproszenia ES6.
Edytuj w dniu 07 stycznia 2020 r. Przez @ bh4r4th: Ponieważ kontekst zmienił się z powodu zmian po moim początkowym rozwiązaniu. Chciałbym zaktualizować moje rozwiązanie, aby spełniało obecne kryteria. to znaczy,
Scalaj obiekty w szyku bez tworzenia zduplikowanych obiektów i
zaktualizuj,
value
jeśliname
właściwość już istnieje w poprzedniej tablicyźródło
set
po scaleniu do usunięcia duplikatów. Stworzyłoby to nowy argument zmiennej, ale minimalny kod. Jednak nie jestem wielkim fanem ładunku, który ma nazwy zdefiniowane jako właściwości i wartości jako różne typy. Zamiast tego wolę[ { lang: 'German', age: 25}]
. W ten sposób waga ładunku zostanie zminimalizowana podczas komunikacji między usługami.Łączenie dwóch tablic:
Scalanie dwóch tablic bez zduplikowanych wartości dla „name”:
źródło
Najłatwiej jest z magią ES6:
Połącz dwa z duplikatami:
Bez duplikatów to to samo co powyżej plus:
const distinct = [...new Set(result.map(item => item.YOUR_PROP_HERE))]
źródło
Z lodash:
źródło
Oto jak rozwiązałem podobny problem w kontekście ES6:
Uwaga: to podejście nie zwróci żadnych elementów z tablicy1, które nie pojawiają się w tablicy2.
EDYCJA: Mam kilka scenariuszy, w których chcę zachować elementy, które nie pojawiają się w drugiej tablicy, więc wymyśliłem inną metodę.
źródło
Jeszcze inna wersja wykorzystująca
reduce() method
:źródło
źródło
Możesz użyć obiektu, aby zebrać swoje właściwości, zastępując duplikaty, a następnie rozwinąć / spłaszczyć ten obiekt z powrotem do tablicy. Coś takiego:
Nie wiem, czy to najszybszy sposób, ale działa dla dowolnej liczby tablic wejściowych; na przykład to:
Daje to samo, co w przypadku
a
,arr3
gdy „niemiecki” został zastąpiony przez „naleśniki”.To podejście zakłada, że wszystkie twoje obiekty mają
{name: ..., value: ...}
oczywiście tę samą formę.Możesz zobaczyć, jak działa tutaj (otwórz swoją konsolę): http://jsfiddle.net/ambiguous/UtBbB/
źródło
A co z jQuery Merge?
http://api.jquery.com/jQuery.merge/
Przykład jsFiddle tutaj: http://jsfiddle.net/ygByD/
źródło
name
właściwości.Miałem ten sam problem i na podstawie odpowiedzi guya rozszerzyłem bibliotekę podkreśleń, a także dodałem nieco więcej funkcji, których potrzebowałem. Oto streszczenie .
Mam nadzieję, że okaże się przydatny! Pozdrowienia!
źródło
Niedawno byłem zaskoczony tym problemem i przyszedłem tutaj z nadzieją na odpowiedź, ale zaakceptowana odpowiedź wykorzystuje 2 w pętlach, których nie wolałbym. W końcu udało mi się stworzyć własny. Nie zależy od żadnej biblioteki:
Utrzymuje to również kolejność arr1.
źródło
Możesz użyć następującej funkcji
i próbuj
źródło
Tutaj najpierw filtruję
arr1
na podstawie elementu obecnegoarr2
lub nie. Jeśli jest obecny, nie dodawaj go do wynikowej tablicy, w przeciwnym razie dodaj. A następnie dołączamarr2
do wyniku.źródło
Z góry mojej głowy - spróbuj rozszerzyć jQuery
źródło
var newArray = yourArray.concat(otherArray); console.log('Concatenated newArray: ', newArray);
źródło
Array.protype.push.apply()
odpowiedź, ale nie działa tak, jak chciał OP.Na podstawie odpowiedzi @ YOU, ale zachowując kolejność:
Wiem, że to rozwiązanie jest mniej wydajne, ale jest konieczne, jeśli chcesz zachować porządek i nadal aktualizować obiekty.
źródło
Oto wtyczka jQuery, którą napisałem, aby scalić dwie tablice obiektów za pomocą klucza. Należy pamiętać, że powoduje to lokalną modyfikację tablicy docelowej.
Wersja ES6
źródło
Używając lodash chcesz _.uniqBy
Kolejność arr1, arr2 ma znaczenie!
Zobacz dokumenty https://lodash.com/docs/4.17.4#uniqBy
źródło
źródło
źródło
Jeśli chcesz scalić 2 tablice, ale usunąć zduplikowane obiekty, użyj tego. Duplikaty są identyfikowane na
.uniqueId
każdym obiekcieźródło
Spróbuj tego:
OutPut będzie:
źródło
źródło
Rozwiązanie wykorzystujące mapę JS:
Który produkuje:
źródło
źródło