Mari kita lihat contohnya.
var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
Saya perlu menggabungkan 2 array objek tersebut dan membuat array berikut:
arr3 = new Array({name: "lang", value: "German"}, {name: "age", value: "18"}, {name : "childs", value: '5'});
Apakah ada fungsi JavaScript atau jQuery untuk melakukan ini?
$.extend
tidak cocok untukku. Ia kembali
arr4 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
javascript
jquery
arrays
Alexander
sumber
sumber
{name: "lang", value: "English"}
?Jawaban:
Jika Anda ingin menggabungkan 2 array objek dalam JavaScript. Anda bisa menggunakan trik satu baris ini
Array.prototype.push.apply(arr1,arr2);
Sebagai contoh
Keluaran:
sumber
arr1 = arr1.concat(arr2)
concat
akan mengembalikan array baru dan merusak referensi yang Anda miliki.Dengan ES6 Anda dapat melakukannya dengan sangat mudah seperti di bawah ini:
Keluaran:
sumber
{ name: 'lang', value: 'German'}
Bagi yang bereksperimen dengan hal-hal modern:
sumber
Perbarui 12 Okt 2019
Versi baru hanya berdasarkan Javascript yang lebih baru dan tanpa perlu pustaka pihak ketiga.
Jawaban ini semakin tua, libs seperti lodash dan garis bawah jauh lebih dibutuhkan hari ini. Dalam versi baru ini, array target (arr1) adalah yang sedang kita kerjakan dan ingin kita tetap up to date. The source (arr2) array di mana data baru datang dari, dan kami ingin bergabung ke dalam kami sasaran larik.
Kami mengulang array sumber mencari data baru, dan untuk setiap objek yang belum ditemukan dalam array target kami, kami cukup menambahkan objek itu menggunakan target.push (sourceElement) Jika, berdasarkan properti kunci kita ('name') , sebuah objek sudah ada dalam larik target kami - kami memperbarui properti dan nilainya menggunakan Object.assign (targetElement, sourceElement) . "Target" kami akan selalu sama dan dengan konten yang diperbarui.
Jawaban lama menggunakan garis bawah atau lodash
Saya selalu datang ke sini dari google dan saya selalu tidak puas dengan jawabannya. Jawaban ANDA bagus tetapi akan lebih mudah dan lebih rapi menggunakan underscore.js
DEMO: http://jsfiddle.net/guya/eAWKR/
Berikut adalah fungsi yang lebih umum yang akan menggabungkan 2 array menggunakan properti objeknya. Dalam hal ini, properti tersebut adalah 'nama'
sumber
sumber
Sangat sederhana menggunakan operator spread ES6:
Merged Array: [ {a: 'HI!'}, {b: 'HOW'} {c: 'ARE'}, {d: 'YOU?'} ]
Catatan: Solusi di atas hanya menggabungkan dua array menggunakan operator spread ES6.
Edit pada 07 Januari 2020 oleh @ bh4r4th: Karena konteksnya berubah karena pengeditan setelah solusi awal saya. Saya ingin memperbarui solusi saya agar sesuai dengan kriteria saat ini. yaitu,
Menggabungkan objek array tanpa membuat objek duplikat dan,
perbarui
value
jikaname
properti sudah ada dalam larik sebelumnyasumber
set
setelah penggabungan untuk menghapus duplikat. Ini akan membuat argumen variabel baru tetapi kode minimal. Namun, saya bukan penggemar berat muatan yang memiliki nama yang didefinisikan sebagai properti dan nilai sebagai jenis yang berbeda. Sebaliknya saya lebih suka[ { lang: 'German', age: 25}]
. Dengan cara ini, bobot muatan akan diminimalkan saat berkomunikasi antar layanan.Menggabungkan dua larik:
Menggabungkan dua larik tanpa nilai duplikat untuk 'nama':
sumber
Cara termudah adalah dengan beberapa keajaiban ES6:
Gabungkan dua dengan duplikat:
Tanpa duplikat itu sama dengan plus di atas:
const distinct = [...new Set(result.map(item => item.YOUR_PROP_HERE))]
sumber
Dengan lodash:
sumber
Beginilah cara saya menangani masalah serupa dalam konteks ES6:
Catatan: Pendekatan ini tidak akan mengembalikan item apa pun dari array1 yang tidak muncul dalam array2.
EDIT: Saya memiliki beberapa skenario di mana saya ingin menyimpan item yang tidak muncul di array kedua jadi saya datang dengan metode lain.
sumber
Namun versi lain menggunakan
reduce() method
:sumber
sumber
Anda dapat menggunakan sebuah objek untuk mengumpulkan properti Anda saat mengganti duplikat dan kemudian memperluas / meratakan objek tersebut kembali ke array. Sesuatu seperti ini:
Saya tidak tahu apakah ini adalah cara tercepat tetapi bekerja untuk sejumlah array input; misalnya, ini:
Memberi Anda hal yang sama di
a
dalamarr3
dengan "Jerman" diganti dengan "pancake".Pendekatan ini mengasumsikan bahwa semua objek Anda memiliki
{name: ..., value: ...}
bentuk yang sama tentunya.Anda dapat melihatnya berfungsi di sini (buka konsol Anda): http://jsfiddle.net/ambiguous/UtBbB/
sumber
Bagaimana dengan jQuery Merge?
http://api.jquery.com/jQuery.merge/
Contoh jsFiddle di sini: http://jsfiddle.net/ygByD/
sumber
name
properti.Saya menghadapi masalah yang sama dan berdasarkan jawaban guya, saya telah memperluas pustaka garis bawah dan juga menambahkan lebih banyak fungsionalitas yang saya perlukan. Inilah Intinya .
Semoga bermanfaat! Salam!
sumber
Saya baru-baru ini bingung dengan masalah ini dan saya datang ke sini dengan harapan mendapatkan jawaban tetapi jawaban yang diterima menggunakan 2 untuk dalam loop yang tidak saya sukai. Saya akhirnya berhasil membuatnya sendiri. Tidak bergantung pada pustaka apa pun:
Ini juga mempertahankan urutan arr1.
sumber
Anda bisa menggunakan fungsi berikut
dan coba
sumber
Di sini saya pertama kali menyaring
arr1
berdasarkan elemen yang adaarr2
atau tidak. Jika ada maka jangan tambahkan ke larik yang dihasilkan jika tidak lakukan tambahkan. Dan kemudian saya menambahkanarr2
hasilnya.sumber
Di luar kepalaku - coba jquery memperpanjang
sumber
var newArray = yourArray.concat(otherArray); console.log('Concatenated newArray: ', newArray);
sumber
Array.protype.push.apply()
jawabannya, tetapi, itu tidak melakukan penggabungan seperti yang diinginkan OP.Berdasarkan jawaban @ YOU tetapi tetap menjaga urutan:
Saya tahu solusi ini kurang efisien, tetapi perlu jika Anda ingin menjaga ketertiban dan tetap memperbarui objek.
sumber
Berikut adalah plugin jQuery yang saya tulis untuk menggabungkan dua array objek dengan sebuah kunci. Perlu diingat bahwa ini mengubah larik tujuan di tempat.
Versi ES6
sumber
Menggunakan lodash yang Anda inginkan _.uniqBy
Urutan arr1, arr2 penting!
Lihat dokumen https://lodash.com/docs/4.17.4#uniqBy
sumber
sumber
sumber
Jika Anda ingin menggabungkan 2 array, tetapi menghapus objek duplikat gunakan ini. Duplikat diidentifikasi pada
.uniqueId
setiap objeksumber
Coba ini:
OutPut akan menjadi:
sumber
sumber
Solusi menggunakan JS Map:
Yang menghasilkan:
sumber
sumber