Unisci 2 array di oggetti


112

Vediamo un esempio.

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

Ho bisogno di unire questi 2 array di oggetti e creare il seguente array:

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

Esiste una funzione JavaScript o jQuery per farlo?

$.extendnon mi va bene. Ritorna

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

15
Che ne è stato {name: "lang", value: "English"}?
Shadow Wizard is Ear For You

Scusate. Intendo $ .extend, non $ .merge.
Alexander

1
Voglio dire, qual è la logica coinvolta? Come vuoi unire gli array? Non è chiaro dai tuoi esempi.
Shadow Wizard is Ear For You

Grazie mille a tutti. L'ho fatto manualmente.
Alexander

6
@ ShadowWizard, penso che il significato dell'OP fosse aggiornamento se esiste e push se non lo fa.
Amin Mohamed Ajani,

Risposte:


84

Se vuoi unire 2 array di oggetti in JavaScript. Puoi usare questo trucco di una riga

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

Per esempio

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

Produzione:

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

Questo è finora l'uso più semplice e funziona bene. Grazie per averlo condiviso.
Leo Caseiro

17
stesso risultato molto più semplice:arr1 = arr1.concat(arr2)
keithpjolley

7
ma questo non è unire!
Dimitri Kopriwa

1
I risultati non sono gli stessi. concatrestituirà un nuovo array e interromperà tutti i riferimenti che avevi.
Bpainter

8
Questo non risponde alla domanda, l'array risultante dovrebbe avere 3 oggetti, non 4. Hai cambiato i valori di esempio. Fondamentalmente ciò che OP vuole è unire due array di oggetti e rimuovere i valori duplicati.
Ranjan

43

Con ES6 puoi farlo molto facilmente come di seguito:

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

Produzione:

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

6
Questa dovrebbe essere la risposta migliore.
nocdib

20
Questo non fa quello che l'OP stava cercando, non dovrebbe esserci un secondo oggetto contenente{ name: 'lang', value: 'German'}
Will

3
Non so perché questa risposta sia stata votata. Ciò che @ daveanderson88 vuole è diverso da questa risposta.
Nguyễn Xuân Hoàng

33

Per coloro che stanno sperimentando cose moderne:

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

Aggiornamento 12 ottobre 2019

Nuova versione basata solo su Javascript più recente e senza la necessità di alcuna libreria di terze parti.

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)

Questa risposta stava invecchiando, librerie come lodash e underscore sono molto meno necessarie in questi giorni. In questa nuova versione, l' array di destinazione (arr1) è quello con cui stiamo lavorando e vogliamo mantenerlo aggiornato. L' array di origine (arr2) è da dove provengono i nuovi dati e vogliamo che venga unito alla nostra destinazione array di .

Eseguiamo un ciclo sull'array di origine alla ricerca di nuovi dati e per ogni oggetto che non è stato ancora trovato nel nostro array di destinazione aggiungiamo semplicemente quell'oggetto usando target.push (sourceElement) If, in base alla nostra proprietà chiave ('name') , un object è già nel nostro array di destinazione: aggiorniamo le sue proprietà e valori utilizzando Object.assign (targetElement, sourceElement) . Il nostro "target" sarà sempre lo stesso array e con contenuti aggiornati.


Vecchia risposta con trattino basso o lodash

Arrivo sempre qui da google e non sono sempre soddisfatto dalle risposte. La tua risposta è buona, ma sarà più facile e ordinato usando underscore.js

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

Ecco una funzione più generale che unirà 2 array usando una proprietà dei loro oggetti. In questo caso la proprietà è 'nome'

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
Quasi identica in LOC, complessità come la risposta di @ YOU, tranne per il fatto che questa è molto più lenta (in gran parte a causa di chiamate di funzione extra e il fatto che la risposta di YOU sfrutta il trucco degli array associativi JS per trovare elementi con la ricerca O (1)). Questo è oltre al fatto che devi portare una libreria aggiuntiva.
Mrchief

Non si otterrebbe alcuna differenza in termini di prestazioni a meno che non si tratti di casi limite estremi. Per quanto riguarda la lib extra - sottolineatura, lodash e simili sono generalmente già usati e hanno altri vantaggi, si dovrebbe comunque considerare di usarli. La maggior parte degli sviluppatori e delle app trarrà vantaggio dalla semplicità e dalla generalità di questa soluzione.
guya

1
@guya mi rendo conto che questo è vecchio ma sottolineatura, lodash e simili sono generalmente già usati e hanno altri vantaggi mentre come dici tu hanno altri vantaggi, è un presupposto enorme dire che generalmente sono già usati.
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);

inserisci qui la descrizione dell'immagine


1
Questa risposta ha una cattiva complessità temporale (O (n ^ 2)). Una soluzione O (n) è possibile utilizzando una mappa hash.
Alex von Brandenfels

19

Molto semplice utilizzando l'operatore di diffusione 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?'} ]

Nota: la soluzione di cui sopra è semplicemente unire due array utilizzando l'operatore di diffusione ES6.

Modifica il 7 gennaio 2020 di @ bh4r4th: poiché il contesto è cambiato a causa di modifiche dopo la mia soluzione iniziale. Vorrei aggiornare la mia soluzione in modo che corrisponda ai criteri attuali. vale a dire,

  1. Unisci oggetti array senza creare oggetti duplicati e,

  2. aggiornare valuese la nameproprietà esiste già nell'array precedente

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
Questa dovrebbe essere la risposta accettata nel 2019! Stavo per proporre la stessa soluzione dopo aver esaminato le altre risposte con un numero di voti più alto! @Alexander È facile non vederlo, ma per favore accetta questo!
iaforek

Non corretto. L'interrogante desidera specificamente SOSTITUIRE gli oggetti se hanno una proprietà duplicata, non semplicemente aggiungerli.
HaveSpacesuit

Grazie per aver segnalato che @HaveSpacesuit. Ho risposto a questa domanda nel 2018 quando il contesto è semplicemente unire due array. Modificherà presto questa risposta per utilizzarla al setmomento dell'unione per rimuovere i duplicati. Questo creerebbe un nuovo argomento variabile ma un codice minimo. Tuttavia, non sono un grande fan del payload che ha nomi definiti come proprietà e valori come tipi diversi. Invece preferisco [ { lang: &#39;German&#39;, age: 25}] . In questo modo il peso del carico utile sarà ridotto al minimo durante la comunicazione tra i servizi.
bh4r4

Ora ho aggiornato la soluzione in modo che corrisponda al contesto modificato della domanda.
bh4r4th

16

Unione di due array:

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

Unione di due array senza valori duplicati per "nome":

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 è il modo corretto per unire 2 array in uno solo. Mi piace anche l'ipotesi estesa che il concetto di unione "vera" sia stato affrontato (basato su una determinata chiave di ogni elemento dell'array).
bob

14

Il modo più semplice è con un po 'di magia ES6:

Unisci due con duplicati:

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

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

Senza duplicati è uguale al precedente più:

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


1
concat non funziona con elementi di natura diversa
fdsfdsfdsfds

7

Con lodash:

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

che la sintassi di ES6 funziona con 2 array, non con 2 array di oggetti.
Dario

7

Ecco come ho affrontato un problema simile in un contesto 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);
    });
}

Nota: questo approccio non restituirà alcun elemento da array1 che non appare in array2.


EDIT: ho alcuni scenari in cui voglio preservare gli elementi che non appaiono nel secondo array, quindi ho escogitato un altro metodo.

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

Ancora un'altra versione che utilizza 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"/>


Questo ha funzionato benissimo per me. Un piccolo problema però è che l'ordinamento a volte è strano quando si
uniscono

5

Soluzione semplice

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

È possibile utilizzare un oggetto per raccogliere le proprietà durante la sostituzione dei duplicati e quindi espandere / appiattire l'oggetto in un array. Qualcosa come questo:

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

Non so se questo sia il modo più veloce ma funziona per un numero qualsiasi di array di input; ad esempio, questo:

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

Ti dà la stessa cosa ache c'era inarr3 con "German" sostituito da "Pancakes".

Questo approccio presuppone che i tuoi oggetti abbiano tutti lo stesso {name: ..., value: ...} forma, ovviamente.

Puoi vederlo funzionare qui (apri la tua console per favore): http://jsfiddle.net/ambiguous/UtBbB/



2

Stavo affrontando lo stesso problema e in base alla risposta guya ho esteso la libreria di sottolineature e ho anche aggiunto un po 'più di funzionalità che stavo richiedendo. Ecco il succo .

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

Spero che sia utile! Saluti!


2

Di recente sono stato perplesso con questo problema e sono venuto qui con la speranza di avere una risposta, ma la risposta accettata utilizza 2 cicli for in che non preferirei. Finalmente sono riuscito a crearne uno mio. Non dipende da nessuna libreria:

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

Questo mantiene anche l'ordine di arr1.


2

è possibile utilizzare la seguente funzione

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

e prova

merge(arr1, arr2, 'name');

Grazie a Diago Way con la funzione immutabile ES6 `` export const mergeArrays = (a1, a2, key = "id") => a1 && a2! = Null? [... a1.filter (a =>! a2.find (p => p [chiave] === a [chiave])), ... a2]: null; ``
Musa

1

Qui prima filtro in arr1base all'elemento presente arr2o meno. Se è presente, non aggiungerlo all'array risultante altrimenti aggiungi. E poi mi accodo arr2al risultato.

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

Fornisci gentilmente la spiegazione alla tua risposta. Quindi, se qualsiasi altra persona legge la domanda e risponde, allora può essere facilmente compresa.
Mittal Patel

Sebbene questa risposta sia probabilmente corretta e utile, è preferibile includere qualche spiegazione insieme ad essa per spiegare come aiuta a risolvere il problema. Ciò diventa particolarmente utile in futuro, se c'è un cambiamento (forse non correlato) che fa smettere di funzionare e gli utenti devono capire come funzionava una volta.
Erty Seidohl

Grazie ragazzi. Ho aggiornato la descrizione della soluzione. Se sembra corretto, pls upvote :)
maulik bhatt

0

Dalla parte superiore della mia testa - prova jquery extension

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

Scusate. Esattamente questa funzione restituisce arr4. Non $ .merge. Anche l'ultimo non mi va bene, perché duplica gli oggetti.
Alexander


0

Basato sulla risposta di @ YOU ma mantenendo l'ordine:

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

So che questa soluzione è meno efficiente, ma è necessaria se vuoi mantenere l'ordine e aggiornare comunque gli oggetti.


0

Ecco un plugin jQuery che ho scritto per unire due array di oggetti con una chiave. Tieni presente che ciò modifica la matrice di destinazione sul posto.

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


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

0

Usando lodash vuoi _.uniqBy

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

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

Ordine di arr1, questioni di arr2!

Consulta la documentazione https://lodash.com/docs/4.17.4#uniqBy


hai bisogno di usare terze parti?
Nguyễn Xuân Hoàng

no ma è il modo più conciso per ottenerlo, e non è solo una terza parte, il suo lodash!
danday74

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

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

2
Basta non fornire la risposta alla domanda. Spiega anche come questa soluzione risolve il problema.
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

Se vuoi unire i 2 array, ma rimuovere gli oggetti duplicati, usa questo. I duplicati sono identificati su .uniqueIdogni oggetto

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

0

Prova questo:

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 sarà:

  [{
    "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

Soluzione che utilizza 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"));

Che produce:

risultato della funzione merge ()


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" }]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.