Gabungkan 2 array objek

112

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?

$.extendtidak cocok untukku. Ia kembali

arr4 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
Alexander
sumber
15
Apa yang terjadi {name: "lang", value: "English"}?
Shadow Wizard adalah Ear For You
Maaf. Saya menyebutkan $ .extend, bukan $ .merge.
Alexander
1
Maksud saya, logika apa yang terlibat? Bagaimana Anda ingin menggabungkan array? Tidak jelas dari contoh Anda.
Shadow Wizard adalah Ear For You
Terima kasih banyak. Saya melakukannya secara manual.
Alexander
6
@ShadowWizard, saya pikir yang dimaksud OP adalah update jika ada dan push jika tidak.
Amin Mohamed Ajani

Jawaban:

84

Jika Anda ingin menggabungkan 2 array objek dalam JavaScript. Anda bisa menggunakan trik satu baris ini

Array.prototype.push.apply(arr1,arr2);

Sebagai contoh

var arr1 = [{name: "lang", value: "English"},{name: "age", value: "18"}];
var arr2 = [{name : "childs", value: '5'}, {name: "lang", value: "German"}];

Array.prototype.push.apply(arr1,arr2); 

console.log(arr1);  // final merged result will be in arr1

Keluaran:

[{"name":"lang","value":"English"},
{"name":"age","value":"18"},
{"name":"childs","value":"5"},
{"name":"lang","value":"German"}]
Jahanzaib Aslam
sumber
Sejauh ini, ini adalah penggunaan yang paling sederhana dan berfungsi dengan baik. Terima kasih telah membagikannya.
Leo Caseiro
17
hasil yang sama dengan yang lebih sederhana:arr1 = arr1.concat(arr2)
keithpjolley
7
tapi ini tidak digabungkan!
Dimitri Kopriwa
1
Hasilnya tidak sama. concatakan mengembalikan array baru dan merusak referensi yang Anda miliki.
Bpainter
8
Ini tidak menjawab pertanyaan, larik yang dihasilkan harus memiliki 3 objek, bukan 4. Anda mengubah nilai sampel. Pada dasarnya apa yang diinginkan OP adalah menggabungkan dua array objek dan menghapus nilai duplikat.
Ranjan
43

Dengan ES6 Anda dapat melakukannya dengan sangat mudah seperti di bawah ini:

var arr1 = new Array({name: "lang", value: "German"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
var arr3 = [...arr1, ...arr2];

Keluaran:

    arr3 = [
      {"name":"lang","value":"German"},
      {"name":"age","value":"18"},
      {"name":"childs","value":"5"},
      {"name":"lang","value":"German"}
    ]
Nguyễn Bá Vinh
sumber
6
Ini harus menjadi jawaban teratas.
nocdib
20
Ini tidak melakukan apa yang dicari OP, seharusnya tidak ada objek kedua yang berisi{ name: 'lang', value: 'German'}
Will
3
Saya tidak tahu alasan mengapa jawaban ini dipilih. Yang diinginkan @ daveanderson88 adalah berbeda dengan jawaban ini.
Nguyễn Xuân Hoàng
33

Bagi yang bereksperimen dengan hal-hal modern:

var odd = [
    { name : "1", arr: "in odd" },
    { name : "3", arr: "in odd" }
];

var even = [
    { name : "1", arr: "in even" },
    { name : "2", arr: "in even" },
    { name : "4", arr: "in even" }
];

// ----
// ES5 using Array.filter and Array.find
function merge(a, b, prop){
  var reduced = a.filter(function(aitem){
      return ! b.find(function(bitem){
          return aitem[prop] === bitem[prop];
      });
  });
  return reduced.concat(b);
}
console.log( "ES5", merge(odd, even, "name") );

// ----
// ES6 arrow functions
function merge(a, b, prop){
    var reduced =  a.filter( aitem => ! b.find ( bitem => aitem[prop] === bitem[prop]) )
  return reduced.concat(b);
}
console.log( "ES6", merge(odd, even, "name") );

// ----
// ES6 one-liner
var merge = (a, b, p) => a.filter( aa => ! b.find ( bb => aa[p] === bb[p]) ).concat(b);


console.log( "ES6 one-liner", merge(odd, even, "name") );

// Results
// ( stuff in the "b" array replaces things in the "a" array )
// [
//    {
//         "name": "3",
//         "arr": "in odd"
//     },
//     {
//         "name": "1",
//         "arr": "in even"
//     },
//     {
//         "name": "2",
//         "arr": "in even"
//     },
//     {
//         "name": "4",
//         "arr": "in even"
//     }
// ]
bob
sumber
29

Perbarui 12 Okt 2019

Versi baru hanya berdasarkan Javascript yang lebih baru dan tanpa perlu pustaka pihak ketiga.

const mergeByProperty = (target, source, prop) => {
  source.forEach(sourceElement => {
    let targetElement = target.find(targetElement => {
      return sourceElement[prop] === targetElement[prop];
    })
    targetElement ? Object.assign(targetElement, sourceElement) : target.push(sourceElement);
  })
}
var target /* arr1 */ = [{name: "lang", value: "English"}, {name: "age", value: "18"}];
var source /* arr2 */ = [{name : "childs", value: '5'}, {name: "lang", value: "German"}];

mergeByProperty(target, source, 'name');

console.log(target)

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'

var arr1 = [{name: "lang", value: "English"}, {name: "age", value: "18"}];
var arr2 = [{name : "childs", value: '5'}, {name: "lang", value: "German"}];

function mergeByProperty(arr1, arr2, prop) {
  _.each(arr2, function(arr2obj) {
    var arr1obj = _.find(arr1, function(arr1obj) {
      return arr1obj[prop] === arr2obj[prop];
    });

    arr1obj ? _.extend(arr1obj, arr2obj) : arr1.push(arr2obj);
  });
}

mergeByProperty(arr1, arr2, 'name');

console.log(arr1);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.core.min.js"></script>

[{name: "lang", value: "German"}, {name: "age", value: "18"}, {name : "childs", value: '5'}]
guya
sumber
6
Hampir identik di LOC, kompleksitasnya seperti jawaban @ YOU, kecuali bahwa ini jauh lebih lambat (sebagian besar disebabkan oleh pemanggilan fungsi tambahan dan fakta bahwa jawaban YOU mengeksploitasi trik array asosiatif JS untuk menemukan item dengan pencarian O (1)). Ini selain fakta bahwa Anda perlu membawa perpustakaan tambahan.
Mrchief
Anda tidak akan mendapatkan perbedaan dalam performa kecuali jika Anda berurusan dengan kasus edge yang ekstrem. Mengenai lib ekstra - garis bawah, lodash dan sejenisnya umumnya sudah digunakan dan memiliki manfaat lain, bagaimanapun juga orang harus mempertimbangkan untuk menggunakannya. Sebagian besar pengembang dan aplikasi akan mendapatkan keuntungan dari kesederhanaan dan keumuman solusi ini.
guya
1
@guya Saya menyadari ini sudah tua tetapi menggarisbawahi, lodash dan sejenisnya umumnya sudah digunakan dan memiliki manfaat lain sementara seperti yang Anda katakan mereka memiliki manfaat lain, asumsi besar untuk mengatakan mereka umumnya sudah digunakan.
Craicerjack
26
var arr3 = [];
for(var i in arr1){
   var shared = false;
   for (var j in arr2)
       if (arr2[j].name == arr1[i].name) {
           shared = true;
           break;
       }
   if(!shared) arr3.push(arr1[i])
}
arr3 = arr3.concat(arr2);

masukkan deskripsi gambar di sini

KAMU
sumber
1
Jawaban ini memiliki kompleksitas waktu yang buruk (O (n ^ 2)). Solusi O (n) dimungkinkan menggunakan peta hash.
Alex von Brandenfels
19

Sangat sederhana menggunakan operator spread ES6:

const array1 = [{a: 'HI!'}, {b: 'HOW'}]
const array2 = [{c: 'ARE'}, {d: 'YOU?'}]

const mergedArray = [ ...array1, ...array2 ]
console.log('Merged Array: ', mergedArray)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

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,

  1. Menggabungkan objek array tanpa membuat objek duplikat dan,

  2. perbarui valuejika nameproperti sudah ada dalam larik sebelumnya

const arr1 = [
    { name: "lang", value: "English" },
    { name: "age", value: "18" }
]
const arr2 = [
    { name: "childs", value: '2' }, 
    { name: "lang", value: "German" }
]
const arr3 = [
    { name: "lang", value: "German" },
    { name: "age", value: "28" },
    { name: "childs", value: '5' }
]

// Convert to key value dictionary or object
const convertToKeyValueDict = arrayObj => {
    const val = {}
    arrayObj.forEach(ob => {
        val[ob.name] = ob.value
    })
    return val
}

// update or merge array
const updateOrMerge = (a1, a2) => {
    const ob1 = convertToKeyValueDict(a1)
    const ob2 = convertToKeyValueDict(a2)
    // Note: Spread operator with objects used here
    const merged_obj = {...ob1, ...ob2}
    const val = Object.entries(merged_obj)
    return val.map(obj => ({ name: obj[0], value: obj[1] }))
}

const v1 = updateOrMerge(arr1, arr2)
const v2 = updateOrMerge(v1, arr3)
console.log(`Merged array1 and array2: ${JSON.stringify(v1)} \n\n`)
console.log(`Merged above response and array3: ${JSON.stringify(v2)} \n\n`)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

bh4r4th
sumber
1
Ini harus menjadi jawaban yang diterima di 2019! Saya akan mengusulkan solusi yang sama setelah melihat jawaban lain dengan jumlah suara yang lebih tinggi! @Alexander Sangat mudah untuk dilewatkan tapi terimalah yang ini!
iaforek
Salah. Penanya secara khusus ingin MENGGANTI objek jika mereka memiliki properti duplikat, tidak hanya menambahkannya.
HaveSpacesuit
Terima kasih telah menunjukkan @HaveSpacesuit itu. Saya telah menjawab pertanyaan ini pada tahun 2018 ketika konteksnya hanya menggabungkan dua array. Akan segera mengedit jawaban ini untuk digunakan setsetelah 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: &#39;German&#39;, age: 25}] . Dengan cara ini, bobot muatan akan diminimalkan saat berkomunikasi antar layanan.
bh4r4th
Sekarang saya telah memperbarui solusi agar sesuai dengan konteks pertanyaan yang diubah.
bh4r4
16

Menggabungkan dua larik:

var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
var result=arr1.concat(arr2);
// result: [{name: "lang", value: "English"}, {name: "age", value: "18"}, {name : "childs", value: '5'}, {name: "lang", value: "German"}]

Menggabungkan dua larik tanpa nilai duplikat untuk 'nama':

var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
var i,p,obj={},result=[];
for(i=0;i<arr1.length;i++)obj[arr1[i].name]=arr1[i].value;
for(i=0;i<arr2.length;i++)obj[arr2[i].name]=arr2[i].value;
for(p in obj)if(obj.hasOwnProperty(p))result.push({name:p,value:obj[p]});
// result: [{name: "lang", value: "German"}, {name: "age", value: "18"}, {name : "childs", value: '5'}]
Andrew D.
sumber
Array.concat adalah cara yang tepat untuk menggabungkan 2 array menjadi satu. Saya juga menyukai asumsi yang diperluas bahwa konsep penggabungan "benar" telah ditangani (berdasarkan kunci yang diberikan dari setiap elemen array).
bob
14

Cara termudah adalah dengan beberapa keajaiban ES6:

Gabungkan dua dengan duplikat:

const a = [{a: 1}, {b: 2}]
const b = [{a: 1}]

const result = a.concat(b) // [{a: 1}, {b: 2}, {a: 1}]

Tanpa duplikat itu sama dengan plus di atas:

const distinct = [...new Set(result.map(item => item.YOUR_PROP_HERE))]

knikolov.dll
sumber
1
concat tidak berfungsi dengan item dengan sifat berbeda
fdsfdsfdsfds
7

Dengan lodash:

_.uniqBy([...arr1, ...arr2], 'name')
Pietro
sumber
sintaks ES6 itu bekerja dengan 2 larik, bukan dengan 2 larik objek.
Dario
7

Beginilah cara saya menangani masalah serupa dalam konteks ES6:

function merge(array1, array2, prop) {
    return array2.map(function (item2) {
        var item1 = array1.find(function (item1) {
            return item1[prop] === item2[prop];
        });
        return Object.assign({}, item1, item2);
    });
}

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.

function mergeArrays(arrays, prop) {
    const merged = {};

    arrays.forEach(arr => {
        arr.forEach(item => {
            merged[item[prop]] = Object.assign({}, merged[item[prop]], item);
        });
    });

    return Object.values(merged);
}

var arr1 = [
    { name: 'Bob', age: 11 },
    { name: 'Ben', age: 12 },
    { name: 'Bill', age: 13 },
];

var arr2 = [
    { name: 'Bob', age: 22 },
    { name: 'Fred', age: 24 },
    { name: 'Jack', age: 25 },
    { name: 'Ben' },
];

console.log(mergeArrays([arr1, arr2], 'name'));
marktuk
sumber
6

Namun versi lain menggunakan reduce() method:

var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});

var arr = arr1.concat(arr2).reduce(function(prev, current, index, array){ 
   
   if(!(current.name in prev.keys)) {
      prev.keys[current.name] = index;
      prev.result.push(current);   
   } 
   else{
       prev.result[prev.keys[current.name]] = current;
   }  

   return prev;
},{result: [], keys: {}}).result;
  
document.getElementById("output").innerHTML = JSON.stringify(arr,null,2);    
<pre id="output"/>

Vadim Gremyachev
sumber
Ini bekerja dengan baik untuk saya. Namun satu masalah kecil adalah urutan terkadang aneh saat menggabungkan 3 objek json besar
crh225
5

Solusi sederhana

var tx = [{"id":1},{"id":2}];
var tx1 = [{"id":3},{"id":4}];


var txHistory = tx.concat(tx1)

console.log(txHistory); 
// output
 // [{"id":1},{"id":2},{"id":3},{"id":4}];
Shashwat Gupta
sumber
4

Anda dapat menggunakan sebuah objek untuk mengumpulkan properti Anda saat mengganti duplikat dan kemudian memperluas / meratakan objek tersebut kembali ke array. Sesuatu seperti ini:

function merge(args) {
    args  = Array.prototype.slice.call(arguments);
    var o = { };
    for(var i = 0; i < args.length; ++i)
        for(var j = 0; j < args[i].length; ++j)
            o[args[i][j].name] = args[i][j].value;
    return o;
}

function expand(o) {
    var a = [ ];
    for(var p in o)
        if(o.hasOwnProperty(p))
            a.push({ name: p, value: o[p]});
    return a;
}

var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
var arr3 = expand(merge(arr1, arr2));

Saya tidak tahu apakah ini adalah cara tercepat tetapi bekerja untuk sejumlah array input; misalnya, ini:

var a = expand(
    merge(
        [{name: "lang", value: "English"}, {name: "age", value: "18"}],
        [{name: "childs", value: '5'}, {name: "lang", value: "German"}],
        [{name: 'lang', value: 'Pancakes'}]
    )
);

Memberi Anda hal yang sama di adalamarr3 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/

mu terlalu pendek
sumber
2

Bagaimana dengan jQuery Merge?

http://api.jquery.com/jQuery.merge/

Contoh jsFiddle di sini: http://jsfiddle.net/ygByD/

321X
sumber
Itu tidak akan menggantikan bahasa Inggris dengan bahasa Jerman seperti yang ditentukan, penggabungan berlangsung di sepanjang nameproperti.
mu terlalu pendek
AH ya, kamu benar! Saya tidak melihat spesifikasi itu sekilas!
321X
+1. Baik! di sisi lain itu adalah fungsi yang cukup baik untuk menggabungkan array javascript dari objek
Muhammad Raheel
2

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 .

/**
 * Merges two object-like arrays based on a key property and also merges its array-like attributes specified in objectPropertiesToMerge.
 * It also removes falsy values after merging object properties.
 *
 * @param firstArray The original object-like array.
 * @param secondArray An object-like array to add to the firstArray.
 * @param keyProperty The object property that will be used to check if objects from different arrays are the same or not.
 * @param objectPropertiesToMerge The list of object properties that you want to merge. It all must be arrays.
 * @returns The updated original array.
 */
function merge(firstArray, secondArray, keyProperty, objectPropertiesToMerge) {

    function mergeObjectProperties(object, otherObject, objectPropertiesToMerge) {
        _.each(objectPropertiesToMerge, function (eachProperty) {
            object[eachProperty] = _.chain(object[eachProperty]).union(otherObject[eachProperty]).compact().value();
        });
    }

    if (firstArray.length === 0) {
        _.each(secondArray, function (each) {
            firstArray.push(each);
        });
    } else {
        _.each(secondArray, function (itemFromSecond) {
            var itemFromFirst = _.find(firstArray, function (item) {
                return item[keyProperty] === itemFromSecond[keyProperty];
            });

            if (itemFromFirst) {
                mergeObjectProperties(itemFromFirst, itemFromSecond, objectPropertiesToMerge);
            } else {
                firstArray.push(itemFromSecond);
            }
    });
    }

    return firstArray;
}

_.mixin({
            merge: merge
        });

Semoga bermanfaat! Salam!

Nahuel Barrios
sumber
2

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:

function find(objArr, keyToFind){
    var foundPos = objArr.map(function(ob){
        return ob.type;
    }).indexOf(keyToFind);
    return foundPos;
}

function update(arr1,arr2){
    for(var i = 0, len = arr2.length, current; i< len; i++){
        var pos = find(arr1, arr2[i].name); 
        current = arr2[i];
        if(pos !== -1) for(var key in arr2) arr1[pos][key] = arr2[key];
        else arr1[arr1.length] = current;
    } 
}

Ini juga mempertahankan urutan arr1.

Amin Mohamed Ajani
sumber
2

Anda bisa menggunakan fungsi berikut

const merge = (a, b, key = "id") =>
  a.filter(elem => !b.find(subElem => subElem[key] === elem[key]))
   .concat(b);

dan coba

merge(arr1, arr2, 'name');
Diogo Alves
sumber
Berkat cara Diago dengan fitur tetap ES6 `` export const mergeArrays = (a1, a2, key = "id") => a1 && a2! = Null? [... a1.filter (a =>! a2.find (p => p [key] === a [key])), ... a2]: null; ``
Musa
1

Di sini saya pertama kali menyaring arr1berdasarkan elemen yang ada arr2atau tidak. Jika ada maka jangan tambahkan ke larik yang dihasilkan jika tidak lakukan tambahkan. Dan kemudian saya menambahkan arr2hasilnya.

arr1.filter(item => {
  if (!arr2.some(item1=>item.name==item1.name)) {
    return item
  }
}).concat(arr2)
maulik bhatt
sumber
Mohon berikan penjelasan atas jawaban Anda. Jadi jika ada orang lain yang membaca tanya jawab maka dengan mudah bisa dimengerti.
Mittal Patel
Meskipun jawaban ini mungkin benar dan berguna, akan lebih disukai jika Anda menyertakan beberapa penjelasan bersama untuk menjelaskan bagaimana hal itu membantu memecahkan masalah. Ini menjadi sangat berguna di masa mendatang, jika ada perubahan (mungkin tidak terkait) yang menyebabkannya berhenti bekerja dan pengguna perlu memahami cara kerjanya dulu.
Erty Seidohl
Terima kasih kawan. Saya memperbarui deskripsi solusi. Jika tampaknya benar, mohon
beri suara positif
0

Di luar kepalaku - coba jquery memperpanjang

var arr3 = jQuery.extend(arr1,arr2....)
Xhalent
sumber
Maaf. Tepatnya fungsi ini mengembalikan arr4. Bukan $ .merge. Yang terakhir juga tidak cocok untuk saya, karena menduplikasi objek.
Alexander
0

var newArray = yourArray.concat(otherArray); console.log('Concatenated newArray: ', newArray);

javaScriptBeard
sumber
Saya setuju bahwa ini jauh lebih masuk akal daripada Array.protype.push.apply()jawabannya, tetapi, itu tidak melakukan penggabungan seperti yang diinginkan OP.
keithpjolley
Anda tidak bisa mendapatkan output di atas menggunakan 'concat' jika Anda memiliki dua array gabungan objek. Silakan periksa ini jsfiddle.net/jahanzaibaslam/z22n5tuo
Jahanzaib Aslam
0

Berdasarkan jawaban @ YOU tetapi tetap menjaga urutan:

var arr3 = [];
for(var i in arr1){
   var shared = false;
   for (var j in arr2)
       if (arr2[j].name == arr1[i].name) {
           arr3.push(arr1[j]
           shared = true;
           break;
       }
   if(!shared) arr3.push(arr1[i])
}

for(var j in arr2){
   var shared = false;
   for (var i in arr1)
       if (arr2[j].name == arr1[i].name) {
           shared = true;
           break;
       }
   if(!shared) arr3.push(arr2[j])
}
arr3

Saya tahu solusi ini kurang efisien, tetapi perlu jika Anda ingin menjaga ketertiban dan tetap memperbarui objek.

hcarreras
sumber
0

Berikut adalah plugin jQuery yang saya tulis untuk menggabungkan dua array objek dengan sebuah kunci. Perlu diingat bahwa ini mengubah larik tujuan di tempat.

(function($) {
  $.extendObjectArray = function(destArray, srcArray, key) {
    for (var index = 0; index < srcArray.length; index++) {
      var srcObject = srcArray[index];
      var existObject = destArray.filter(function(destObj) {
        return destObj[key] === srcObject[key];
      });
      if (existObject.length > 0) {
        var existingIndex = destArray.indexOf(existObject[0]);
        $.extend(true, destArray[existingIndex], srcObject);
      } else {
        destArray.push(srcObject);
      }
    }
    return destArray;
  };
})(jQuery);

var arr1 = [
  { name: "lang",   value: "English" },
  { name: "age",    value: "18"      }
];
var arr2 = [
  { name: "childs", value: '5'       },
  { name: "lang",   value: "German"  }
];
var arr3 = $.extendObjectArray(arr1, arr2, 'name');

console.log(JSON.stringify(arr3, null, 2));
.as-console-wrapper { top: 0; max-height: 100% !important; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


Versi ES6

(function($) {
  $.extendObjectArray = (destArr, srcArr, key) => {
    srcArr.forEach(srcObj => (existObj => {
      if (existObj.length) {
        $.extend(true, destArr[destArr.indexOf(existObj[0])], srcObj);
      } else {
        destArr.push(srcObj);
      }
    })(destArr.filter(v => v[key] === srcObj[key])));
    return destArr;
  };
})(jQuery);
Tuan Polywhirl
sumber
0

Menggunakan lodash yang Anda inginkan _.uniqBy

var arr3 = _.uniqBy(arr1.concat(arr2), 'name'); // es5

let arr3 = _.uniqBy([...arr1, ...arr2], 'name'); // es6

Urutan arr1, arr2 penting!

Lihat dokumen https://lodash.com/docs/4.17.4#uniqBy

danday74
sumber
perlu menggunakan pihak ketiga?
Nguyễn Xuân Hoàng
bukan tapi itu cara paling ringkas untuk mencapainya, dan bukan sembarang pihak ketiga, lodash-nya!
danday74
0
const extend = function*(ls,xs){
   yield* ls;
   yield* xs;
}

console.log( [...extend([1,2,3],[4,5,6])]  );
codemonkey
sumber
2
Hanya saja, jangan berikan jawaban dari pertanyaan itu. Juga jelaskan bagaimana solusi ini menyelesaikan masalah.
Mittal Patel
0
merge(a, b, key) {
    let merged = [];
    a.forEach(aitem => {
        let found = b.find( bitem => aitem[key] === bitem[key]);
        merged.push(found? found: aitem);
    });
    return merged;
}
Kyaw
sumber
0

Jika Anda ingin menggabungkan 2 array, tetapi menghapus objek duplikat gunakan ini. Duplikat diidentifikasi pada .uniqueIdsetiap objek

function mergeObjectArraysRemovingDuplicates(firstObjectArray, secondObjectArray) {
  return firstObjectArray.concat(
    secondObjectArray.filter((object) => !firstObjectArray.map((x) => x.uniqueId).includes(object.uniqueId)),
  );
}
daveanderson88
sumber
0

Coba ini:

var a = [{"a":20, "b":10,"c":"c","d":"asd","f":"any"}]
var b = [{"a":20, "b":10,"c":"c", "e":"nan","g":10200}]

var p = []
_.map(a, function(da){
var chk = _.filter(b, function(ds){
return da.a ===ds.a
})[0]
p.push(_.extend(da, chk))


})

console.log(p)

OutPut akan menjadi:

  [{
    "a": 20,
    "b": 10,
    "c": "c",
    "d": "asd",
    "f": "any",
    "e": "nan",
    "g": 10200
  }]
Rohit Parte
sumber
0
const arr1 = ["Vijendra","Singh"];
const arr2 = ["Singh", "Shakya"];

arr2.forEach(item => {
        if(!arr1.find(k => k===item))
          arr1.push(item)
    });


console.log(arr1)
Gajju
sumber
0

Solusi menggunakan JS Map:

const merge = (arr1, arr2, prop) => {
    const resultMap = new Map([...arr1.map((item) => [item[prop], item])]);
    arr2.forEach((item) => {
        const mapItem = resultMap.get(item[prop]);
        if (mapItem) Object.assign(mapItem, item);
        else resultMap.set(item[prop], item);
    });
    return [...resultMap.values()];
};

const arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
const arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});

console.log(merge(arr1, arr2, "name"));

Yang menghasilkan:

hasil fungsi merge ()

2DH
sumber
0
const array1 = [{id:1,name:'ganza'},
{id:2,name:'respice dddd'},{id:4,name:'respice dddd'},{id:6,name:'respice dddd'},
{id:7,name:'respice dddd'}];
const array2 = [{id:1,name:'ganza respice'},{id:2,name:'respice'},{id:3,name:'mg'}];

 function mergeTwoArray(array1,array2){

    return array1.map((item,i)=>{
        if(array2[i] && item.id===array2[i].id){
          return array2[i];
          }else{
            return item;
          }
    });
  }

const result = merge(array1,array2);
console.log(result);
//here is the result:  Array [Object { id: 1, name: "ganza respice" }, Object { id: 2, name: "respice" }, Object { id: 4, name: "respice dddd" }, Object { id: 6, name: "respice dddd" }, Object { id: 7, name: "respice dddd" }]
Ganza respice
sumber