2 nesne dizisini birleştirme


112

Bir örneğe bakalım.

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

Bu 2 nesne dizisini birleştirmem ve aşağıdaki diziyi oluşturmam gerekiyor:

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

Bunu yapmak için herhangi bir JavaScript veya jQuery işlevi var mı?

$.extendbana uymuyor. Döner

arr4 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});

15
Ne oldu {name: "lang", value: "English"}?
Gölge Sihirbazı Sizin İçin Kulak

Afedersiniz. $ .Extend, $ .merge değil.
Alexander

1
Demek istediğim, dahil olan mantık nedir? Dizileri nasıl birleştirmek istiyorsunuz? Örneklerinizden net değil.
Gölge Sihirbazı Sizin İçin Kulak

Hepinize çok teşekkürler. Ben elle yaptım.
Alexander

6
@ShadowWizard, bence OP'nin anlamı varsa güncelleme, yoksa itme.
Amin Mohamed Ajani

Yanıtlar:


84

JavaScript'te 2 nesne dizisini birleştirmek istiyorsanız. Bu tek satırlık numarayı kullanabilirsin

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

Örneğin

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

Çıktı:

[{"name":"lang","value":"English"},
{"name":"age","value":"18"},
{"name":"childs","value":"5"},
{"name":"lang","value":"German"}]

Bu şimdiye kadarki en basit kullanım ve gayet iyi çalışıyor. Paylaştığınız için teşekkürler
Leo Caseiro

17
çok daha basit olanla aynı sonuç:arr1 = arr1.concat(arr2)
keithpjolley

7
ama bu birleştirme değil!
Dimitri Kopriwa

1
Sonuçlar aynı değil. concatyeni bir dizi döndürecek ve sahip olduğunuz tüm referansları kesecektir.
Bpainter

8
Bu soruya cevap vermiyor, ortaya çıkan dizinin 4 değil 3 nesnesi olmalı. Örnek değerleri değiştirdiniz. Temel olarak OP'nin istediği şey, iki nesne dizisini birleştirmek ve yinelenen değerleri kaldırmaktır.
Ranjan

43

ES6 ile bunu aşağıdaki gibi çok kolay bir şekilde yapabilirsiniz:

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];

Çıktı:

    arr3 = [
      {"name":"lang","value":"German"},
      {"name":"age","value":"18"},
      {"name":"childs","value":"5"},
      {"name":"lang","value":"German"}
    ]

6
Bu en iyi cevap olmalı.
nocdib

20
Bu, OP ne arıyordu yapmaz içeren ikinci bir nesne olmamalıdır{ name: 'lang', value: 'German'}
Will

3
Bu cevabın neden oylandığını bilmiyorum. @ Daveanderson88'in istediği bu cevap farklı.
Nguyen Xuân Hoàng

33

Modern şeyleri deneyenler için:

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"
//     }
// ]

29

12 Ekim 2019 Güncellemesi

Yeni sürüm yalnızca daha yeni Javascript tabanlı ve herhangi bir üçüncü taraf kitaplığına ihtiyaç duymadan.

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)

Bu cevap eskiyordu, lodash ve alt çizgi gibi kitaplara bugünlerde çok daha az ihtiyaç duyulmaktadır. Bu yeni sürümde, target (arr1) dizisi birlikte çalıştığımız ve güncel tutmak istediğimiz dizidir. Kaynak (ARR2) dizi yeni veri nereden geldiğini, ve bunu bizim birleştirilecek istediğiniz hedef dizisi.

Biz üzerinde döngü kaynak yeni veri arayan dizinin, ve henüz bizim bulunmayan her nesne için hedef dizinin biz sadece bu nesne kullanarak ekleyin target.push (sourceElement) bizim dayalı ise anahtar özelliği ( 'name') , bir nesne zaten hedef dizimizde bulunuyor - özelliklerini ve değerlerini Object.assign (targetElement, sourceElement) kullanarak güncelliyoruz . "Hedefimiz" her zaman aynı dizi ve güncellenmiş içerikle olacaktır.


Alt çizgi veya zıvana kullanarak eski yanıt

Buraya her zaman google'dan geliyorum ve cevaplardan her zaman tatmin olmuyorum. SENİN cevabın iyidir, ancak undercore.js kullanarak daha kolay ve daha temiz olacak

DEMO: http://jsfiddle.net/guya/eAWKR/

Burada, nesnelerinin bir özelliğini kullanarak 2 diziyi birleştirecek daha genel bir işlev var. Bu durumda özellik 'ad'dır

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'}]

6
LOC'de neredeyse aynıdır, karmaşıklık @ YOU'nın cevabıdır, ancak bu çok daha yavaştır (büyük ölçüde ekstra fonksiyon çağrıları ve YOU'nın cevabının O (1) aramalı öğeleri bulmak için JS çağrışımlı diziler hilesini kullanması nedeniyle). Bu, ek bir kütüphane getirmeniz gerektiği gerçeğinin yanı sıra.
Mrchief

Aşırı uç durumlarla uğraşmadığınız sürece performansta herhangi bir fark elde edemezsiniz. Ekstra lib - alt çizgi ile ilgili olarak, lodash ve benzerleri genellikle zaten kullanılmaktadır ve başka faydaları vardır, yine de onu kullanmayı düşünmek gerekir. Çoğu geliştirici ve uygulama, bu çözümün basitliğinden ve genelliğinden yararlanacaktır.
guya

1
@guya Bunun eski olduğunun farkındayım ama alt çizgi, lodash ve benzerleri genellikle zaten kullanılıyor ve başka faydaları var, ancak başka faydaları olduğunu söylediğiniz gibi, genel olarak zaten kullanıldığını söylemek çok büyük bir varsayım.
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);

görüntü açıklamasını buraya girin


1
Bu yanıtın zaman karmaşıklığı kötüdür (O (n ^ 2)). Bir hash haritası kullanılarak bir O (n) çözümü mümkündür.
Alex von Brandenfels

19

ES6 yayma operatörünü kullanmak çok basit:

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?'} ]

Not: Yukarıdaki çözüm, ES6 yayılma operatörünü kullanarak iki diziyi birleştirmektir.

07 Ocak 2020 tarihinde @ bh4r4th tarafından düzenleme: İlk çözümümden sonraki düzenlemeler nedeniyle bağlam değiştiği için. Çözümümü mevcut kriterlere uyacak şekilde güncellemek istiyorum. yani

  1. Yinelenen nesneler oluşturmadan dizi nesnelerini birleştirin ve

  2. güncellemek valuedurumunda nametesis, daha önce dizide olup

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>


1
Bu, 2019'da kabul edilen cevap olmalı! Oy sayısının daha yüksek olduğu diğer cevaplara baktıktan sonra aynı çözümü önerecektim! @Alexander Kaçırmak kolaydır ama lütfen bunu kabul edin!
iaforek

Yanlış. Soruyu soran kişi, nesneleri yalnızca eklemek değil, yinelenen bir özelliğe sahipse özellikle DEĞİŞTİRMEK ister.
HaveSpacesuit

@HaveSpacesuit'i işaret ettiğiniz için teşekkürler. Bu soruyu 2018'de, bağlam sadece iki diziyi birleştirmek olduğunda yanıtladım. Bu yanıtı set, birleştirme sonrasında yinelenenleri kaldırmak için kullanmak üzere yakında düzenleyecektir . Bu, yeni değişken argümanı ancak minimum kod yaratacaktır. Ancak, özellikler olarak tanımlanmış isimleri ve farklı türler olarak değerleri olan büyük bir yük hayranı değilim. Bunun yerine tercih ederim [ { lang: &#39;German&#39;, age: 25}] . Bu şekilde, hizmetler arasında iletişim kurulurken yük ağırlığı en aza indirilecektir.
bh4r4.

Çözümü, sorunun değişen bağlamına uyacak şekilde güncelledim.
bh4r4.

16

İki diziyi birleştirmek:

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"}]

İki diziyi 'ad' için yinelenen değerler olmadan birleştirmek:

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'}]

Array.concat, 2 diziyi bir dizide birleştirmenin uygun yoludur. Ayrıca "gerçek" birleştirme kavramının ele alındığı (her dizi öğesinin belirli bir anahtarına bağlı olarak) genişletilmiş varsayımını da seviyorum.
bob

14

En kolay yol, biraz ES6 sihri kullanmaktır:

İkisini yinelenenlerle birleştirin:

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

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

Çoğaltmalar olmadan yukarıdaki artı ile aynıdır:

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


1
concat farklı nitelikteki öğelerle çalışmıyor
fdsfdsfdsfds

7

Lodash ile:

_.uniqBy([...arr1, ...arr2], 'name')

ES6 sözdizimi 2 nesne dizisiyle değil 2 diziyle çalışır.
Dario

7

ES6 bağlamında benzer bir sorunu şu şekilde çözdüm:

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);
    });
}

Not: Bu yaklaşım, dizi1'den dizi2'de görünmeyen herhangi bir öğeyi döndürmez.


DÜZENLEME: İkinci dizide görünmeyen öğeleri korumak istediğim bazı senaryolarım var, bu yüzden başka bir yöntem buldum.

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'));

6

Yine başka bir sürüm kullanıyor 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"/>


Bu benim için harika çalıştı. Küçük bir sorun olsa da, 3 büyük json nesnesini birleştirirken
sıranın

5

Basit çözüm

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}];

4

Yinelenenleri değiştirirken özelliklerinizi toplamak için bir nesne kullanabilir ve ardından bu nesneyi bir diziye genişletebilir / düzleştirebilirsiniz. Bunun gibi bir şey:

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));

Bunun en hızlı yol olup olmadığını bilmiyorum ama herhangi bir sayıda girdi dizisi için işe yarıyor; örneğin, bu:

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

Size de aynı şeyi verir ao oldu arr3"Krep" ile değiştirilir "Alman" ile.

Bu yaklaşım, nesnelerinizin hepsinin aynı {name: ..., value: ...}elbette olduğunu varsayar .

Burada çalıştığını görebilirsiniz (lütfen konsolunuzu açın): http://jsfiddle.net/ambiguous/UtBbB/



2

Aynı problemle karşı karşıyaydım ve guya cevabına dayanarak alt çizgi kütüphanesini genişlettim ve ayrıca ihtiyacım olan işlevsellikten biraz daha fazlasını ekledim. İşte Temel .

/**
 * 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
        });

Faydalı olmasını umuyoruz! Saygılarımızla!


2

Son zamanlarda bu problemle şaşkına döndüm ve buraya bir cevap alma umuduyla geldim ancak kabul edilen cevap, tercih etmeyeceğim döngülerde 2'yi kullanıyor. Sonunda kendim yapmayı başardım. Herhangi bir kitaplığa bağlı değildir:

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;
    } 
}

Bu aynı zamanda arr1'in sırasını da korur.


2

aşağıdaki işlevi kullanabilirsiniz

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

ve dene

merge(arr1, arr2, 'name');

ES6 değişmez özelliğine sahip Diago yolu sayesinde `` dışa aktarma sabit birleştirmeArrays = (a1, a2, key = "id") => a1 && a2! = Null? [... a1.filter (a =>! a2.find (p => p [anahtar] === a [anahtar])), ... a2]: null; `` `
Musa

1

Burada ilk önce arr1içinde bulunan arr2veya olmayan öğeye göre filtre uyguluyorum . Eğer mevcutsa, sonuç dizisine eklemeyin, aksi takdirde ekleyin. Ve sonra arr2sonuca ekliyorum .

arr1.filter(item => {
  if (!arr2.some(item1=>item.name==item1.name)) {
    return item
  }
}).concat(arr2)

Lütfen cevabınıza açıklama yapınız. Yani soruyu ve cevabı başka biri okursa, o zaman kolayca anlaşılabilir.
Mittal Patel

Bu cevap muhtemelen doğru ve yararlı olsa da, sorunun çözülmesine nasıl yardımcı olduğunu açıklamak için bazı açıklamalara yer vermeniz tercih edilir. Çalışmayı durduran bir değişiklik (muhtemelen ilgisiz) varsa ve kullanıcıların bir zamanlar nasıl çalıştığını anlamaları gerekiyorsa, bu özellikle gelecekte yararlı olur.
Erty Seidohl

Sağolun beyler. Çözüm açıklamasını güncelledim. Doğru görünüyorsa lütfen oy verin :)
maulik bhatt

0

Kafamın üstünden - jquery uzatmayı dene

var arr3 = jQuery.extend(arr1,arr2....)

Afedersiniz. Tam olarak bu işlev arr4'ü döndürür. $ .Merge değil. Sonuncusu da bana uymuyor çünkü nesneleri kopyalıyor.
Alexander

0

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


Bunun Array.protype.push.apply()cevaptan çok daha anlamlı olduğuna katılıyorum , ancak OP'nin istediği gibi birleştirme yapmıyor.
keithpjolley

Eğer iki nesne birleştirme dizisine sahipseniz, 'concat' kullanarak çıktının üzerine çıkamazsınız. Lütfen bunu kontrol edin jsfiddle.net/jahanzaibaslam/z22n5tuo
Jahanzaib Aslam

0

@ YOU yanıtına göre, ancak sırayı koruyarak:

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

Bu çözümün daha az verimli olduğunu biliyorum, ancak düzeni korumak ve yine de nesneleri güncellemek istiyorsanız gereklidir.


0

İşte iki nesne dizisini bir anahtarla birleştirmek için yazdığım bir jQuery eklentisi. Bunun hedef diziyi yerinde değiştirdiğini unutmayın.

(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>


ES6 Sürümü

(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);

0

Lodash kullanarak istediğiniz _.uniqBy

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

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

Arr1 sırası, arr2 önemlidir!

Https://lodash.com/docs/4.17.4#uniqBy belgelerine bakın


üçüncü şahıs kullanmanız mı gerekiyor?
Nguyen Xuân Hoàng

hayır ama bu onu başarmanın en özlü yoludur ve herhangi bir üçüncü taraf değil, zindanı!
danday74

0
const extend = function*(ls,xs){
   yield* ls;
   yield* xs;
}

console.log( [...extend([1,2,3],[4,5,6])]  );

2
Sadece sorunun cevabını vermeyin. Ayrıca bu çözümün sorunu nasıl çözdüğünü açıklayın.
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;
}

0

2 diziyi birleştirmek, ancak yinelenen nesneleri kaldırmak istiyorsanız bunu kullanın. .uniqueIdHer nesnenin kopyaları tanımlanır

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

0

Bunu dene:

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 şöyle olacaktır:

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

0
const arr1 = ["Vijendra","Singh"];
const arr2 = ["Singh", "Shakya"];

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


console.log(arr1)

0

JS Map kullanan çözüm:

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"));

Hangi üretir:

merge () işlevi sonucu


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" }]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.