J'ai deux tableaux avec un champ commun membre. Comment puis-je fusionner le thème facilement?
Par exemple:
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
}];
Attendu:
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
}];
j'ai essayé
var merge = _.unionBy(arr1, arr2, 'member');
mais pas fusionné comme prévu. montré tableau1 valeur. Quelqu'un peut-il m'aider?
Si les deux tableaux sont dans le bon ordre; lorsque chaque élément correspond à son identifiant de membre associé, vous pouvez simplement l'utiliser.
var merge = _.merge(arr1, arr2);
Quelle est la version courte de:
var merge = _.chain(arr1).Zip(arr2).map(function(item) {
return _.merge.apply(null, item);
}).value();
Ou, si les données dans les tableaux ne se trouvent pas dans un ordre particulier, vous pouvez rechercher l'élément associé à l'aide de la valeur de membre.
var merge = _.map(arr1, function(item) {
return _.merge(item, _.find(arr2, { 'member' : item.member }));
});
Vous pouvez facilement convertir cela en mixin. Voir l'exemple ci-dessous:
_.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>
Créez des dictionnaires pour les deux tableaux en utilisant _.keyBy()
, fusionnez les dictionnaires et convertissez le résultat en tableau avec _.values()
. De cette façon, l'ordre des tableaux n'a pas d'importance. En outre, il peut également gérer des tableaux de différentes longueurs.
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>
Utilisation de ES6 Carte
Concat les tableaux, et réduire le tableau combiné à une carte. Utilisez Object # assign pour associer des objets avec le même member
à un nouvel objet et les stocker dans la carte. Convertissez la carte en tableau avec valeurs de Map # et 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);