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>