Disons que j'ai deux objets:
{cars: 'ferrari', fruit: 'peach', info: 'foo', other: ['baz']}
Maintenant, je veux fusionner ces deux objets et toutes les propriétés en conflit. Résultat attendu:
{...obj1, ...obj2}
Cependant, en utilisant la répartition d'objets
{cars: ['ford', 'ferrari'], fruit: 'peach', info: 'foo', other: ['bar', 'baz']}
Renvoie
var obj1 = {cars: 'ford', fruit: 'peach', other: ['bar']} var obj2 = {cars: 'ferrari', info: 'foo', other: ['baz']}
4 Réponses :
Vous pouvez fusionner par propriété et vérifier si la cible n'est pas un tableau ou si la valeur est un tableau.
const merge = (target, source) => Object.entries(source).reduce((o, [k, v]) => { if (k in o) { if (!Array.isArray(o[k])) o[k] = [o[k]]; [].concat(v).forEach(item => { if (!o[k].includes(item)) o[k].push(item); }); } else { o[k] = v; } return o; }, target); var obj1 = { cars: 'ford', fruit: 'peach', other: ['bar'] }, obj2 = {cars: 'ferrari', info: 'foo', other: ['baz'] }, result = [obj1, obj2].reduce(merge, {}); console.log(result);
Il vous suffit de le coder manuellement, il n'y a pas de moyen automatique de faire ce type de fusion. Et, en raison de la façon dont vous souhaitez fusionner les tableaux, il faut un certain nombre de conditions spéciales:
var obj1 = {cars: 'ford', fruit: 'peach', other: ['bar']} var obj2 = {cars: 'ferrari', info: 'foo', other: ['baz']} function merge(obj1, obj2) { let result = Object.assign({}, obj1); for (let [key, value] of Object.entries(obj2)) { if (result.hasOwnProperty(key)) { if (!Array.isArray(result[key])) { // target isn't an array yet, have to convert it to an array result[key] = [result[key]]; } // now copy over either a single entry or an array of entries if (Array.isArray(obj2[key])) { // copy all the array entries over to the other array result[key].push(...obj2[key]); } else { // copy single entry over to the other array result[key].push(obj2[key]); } } else { // result doesn't have this property yet, just copy the value over result[key] = value; } } return result; } console.log(merge(obj1, obj2));
Celui-ci devrait également fonctionner:
function mergeObject(o1, o2) { return { ...o2, ...Object.keys(o1).reduce((r, c) => ({ ...r, [c]: o2.hasOwnProperty(c) ? [ ...(Array.isArray(o1[c]) ? o1[c] : [o1[c]]), ...(Array.isArray(o2[c]) ? o2[c] : [o2[c]]), ] : o1[c] }), {}) } } var obj1 = { cars: 'ford', fruit: 'peach', other: ['bar'] } var obj2 = { cars: 'ferrari', info: 'foo', other: ['baz'] } const result = mergeObject(obj1, obj2) console.log(result)
Voici ma version :)
var obj1 = {cars: 'ford', fruit: 'peach', other: ['bar']} var obj2 = {cars: 'ferrari', info: 'foo', other: ['baz']} var merge = (acc, [k, v]) => { if (k in acc) { acc[k] = [acc[k]].flat().concat(v) } else { acc[k] = v; } return acc; } var res = Object.entries(obj1).reduce(merge, obj2);
Vous devrez parcourir manuellement les éléments de l'objet et créer le nouvel objet
@rzwnahmd pouvez-vous fournir une fonction pour faire cela?
Il y a une réponse qui montre une façon purement JavaScript de faire cela. La bibliothèque Lodash rend le code plus concis.
@VLAZ Désolé, mais je dois le faire en utilisant du javascript pur ...
la structure de données que vous décrivez est une multi-carte, au cas où vous voudriez chercher plus autour du sujet.
@Jake alors vous avez de la chance car comme je l'ai dit il y a des réponses en JavaScript pur.