unir recorrer objetos juntar elementos buscar array agregar javascript lodash

recorrer - unir dos objetos javascript



¿Cómo fusionar dos matrices de objetos usando lodash? (2)

Esta pregunta ya tiene una respuesta aquí:

Tengo dos matrices con un miembro de campo común. ¿Cómo puedo fusionar el tema fácilmente?

Por ejemplo:

var arr1 = [{ "member" : ObjectId("57989cbe54cf5d2ce83ff9d6"), "bank" : ObjectId("575b052ca6f66a5732749ecc"), "country" : ObjectId("575b0523a6f66a5732749ecb") }, { "member" : ObjectId("57989cbe54cf5d2ce83ff9d8"), "bank" : ObjectId("575b052ca6f66a5732749ecc"), "country" : ObjectId("575b0523a6f66a5732749ecb") }]; var arr2 = [{ "member" : ObjectId("57989cbe54cf5d2ce83ff9d6"), "name" : ''xxxxxx'', "age" : 25 }, { "member" : ObjectId("57989cbe54cf5d2ce83ff9d8"), "name" : ''yyyyyyyyyy'', "age" : 26 }];

Esperado:

var merge = [{ "member" : ObjectId("57989cbe54cf5d2ce83ff9d6"), "bank" : ObjectId("575b052ca6f66a5732749ecc"), "country" : ObjectId("575b0523a6f66a5732749ecb"), "name" : ''xxxxxx'', "age" : 25 }, { "member" : ObjectId("57989cbe54cf5d2ce83ff9d8"), "bank" : ObjectId("575b052ca6f66a5732749ecc"), "country" : ObjectId("575b0523a6f66a5732749ecb"), "name" : ''yyyyyyyyyy'', "age" : 26 }];

Lo intenté

var merge = _.unionBy(arr1, arr2, ''member'');

pero no se fusionó como se esperaba. se muestra el valor de array1 . ¿Alguien puede ayudarme?


Cree diccionarios para ambas matrices utilizando _.keyBy() , _.keyBy() los diccionarios y convierta el resultado en una matriz con _.values() . De esta manera, el orden de las matrices no importa. Además, también puede manejar matrices de diferente longitud.

const ObjectId = (id) => id; // mock of ObjectId const arr1 = [{"member" : ObjectId("57989cbe54cf5d2ce83ff9d8"),"bank" : ObjectId("575b052ca6f66a5732749ecc"),"country" : ObjectId("575b0523a6f66a5732749ecb")},{"member" : ObjectId("57989cbe54cf5d2ce83ff9d6"),"bank" : ObjectId("575b052ca6f66a5732749ecc"),"country" : ObjectId("575b0523a6f66a5732749ecb")}]; const arr2 = [{"member" : ObjectId("57989cbe54cf5d2ce83ff9d6"),"name" : ''xxxxxx'',"age" : 25},{"member" : ObjectId("57989cbe54cf5d2ce83ff9d8"),"name" : ''yyyyyyyyyy'',"age" : 26}]; const merged = _(arr1) // start sequence .keyBy(''member'') // create a dictionary of the 1st array .merge(_.keyBy(arr2, ''member'')) // create a dictionary of the 2nd array, and merge it to the 1st .values() // turn the combined dictionary to array .value(); // get the value (array) out of the sequence console.log(merged);

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.14.0/lodash.min.js"></script>

Usando el Map ES6

Conciba las matrices y reduce la matriz combinada a un mapa. Use Object#assign para combinar objetos con el mismo member a un nuevo objeto, y almacenar en el mapa. Convierta el mapa en una matriz con Map#values y spread :

const ObjectId = (id) => id; // mock of ObjectId const arr1 = [{"member" : ObjectId("57989cbe54cf5d2ce83ff9d8"),"bank" : ObjectId("575b052ca6f66a5732749ecc"),"country" : ObjectId("575b0523a6f66a5732749ecb")},{"member" : ObjectId("57989cbe54cf5d2ce83ff9d6"),"bank" : ObjectId("575b052ca6f66a5732749ecc"),"country" : ObjectId("575b0523a6f66a5732749ecb")}]; const arr2 = [{"member" : ObjectId("57989cbe54cf5d2ce83ff9d6"),"name" : ''xxxxxx'',"age" : 25},{"member" : ObjectId("57989cbe54cf5d2ce83ff9d8"),"name" : ''yyyyyyyyyy'',"age" : 26}]; const merged = [...arr1.concat(arr2).reduce((m, o) => m.set(o.member, Object.assign(m.get(o.member) || {}, o)) , new Map()).values()]; console.log(merged);


Si ambas matrices están en el orden correcto; donde cada elemento corresponde a su identificador de miembro asociado, simplemente puede usarlo.

var merge = _.merge(arr1, arr2);

¿Cuál es la versión corta de:

var merge = _.chain(arr1).zip(arr2).map(function(item) { return _.merge.apply(null, item); }).value();

O, si los datos en las matrices no están en ningún orden en particular, puede buscar el elemento asociado por el valor del miembro.

var merge = _.map(arr1, function(item) { return _.merge(item, _.find(arr2, { ''member'' : item.member })); });

Puedes convertirlo fácilmente en un mixin. Vea el ejemplo a continuación:

_.mixin({ ''mergeByKey'' : function(arr1, arr2, key) { var criteria = {}; criteria[key] = null; return _.map(arr1, function(item) { criteria[key] = item[key]; return _.merge(item, _.find(arr2, criteria)); }); } }); var arr1 = [{ "member": ''ObjectId("57989cbe54cf5d2ce83ff9d6")'', "bank": ''ObjectId("575b052ca6f66a5732749ecc")'', "country": ''ObjectId("575b0523a6f66a5732749ecb")'' }, { "member": ''ObjectId("57989cbe54cf5d2ce83ff9d8")'', "bank": ''ObjectId("575b052ca6f66a5732749ecc")'', "country": ''ObjectId("575b0523a6f66a5732749ecb")'' }]; var arr2 = [{ "member": ''ObjectId("57989cbe54cf5d2ce83ff9d8")'', "name": ''yyyyyyyyyy'', "age": 26 }, { "member": ''ObjectId("57989cbe54cf5d2ce83ff9d6")'', "name": ''xxxxxx'', "age": 25 }]; var arr3 = _.mergeByKey(arr1, arr2, ''member''); document.body.innerHTML = JSON.stringify(arr3, null, 4);

body { font-family: monospace; white-space: pre; }

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.14.0/lodash.min.js"></script>