2
votes

ReactJS: Immutable.js: fusion de deux objets Json

J'utilise React, Redux et immuable. J'ai essayé de fusionner deux objets Json, les données et le résultat attendu sont donnés ci-dessous,

{first_name: "abc", surname: "def", email: "abc.def@gmail.com", mobile: ""}

Si les données ne sont pas disponibles sur obj1, elles doivent être extraites de obj2.

J'ai essayé d'utiliser la fusion immuable comme indiqué ci-dessous,

import Immutable, {merge} from "immutable";
const mergedObj = merge(Immutable.fromJS(obj2), Immutable.fromJS(obj1));
console.log(mergedObj)

Le résultat est identique à obj2, essentiellement, la fusion ne se produit pas,

obj1 = 
{id: 1, first_name: "abc", surname: "def", children: ["kid1", "kid2"]}

obj2 = 
{first_name: "abc", surname: "def", email: "abc.def@gmail.com", mobile: ""}

mergedObj = {id: 1, first_name: "abc", surname: "def", email: "abc.def@gmail.com", Mobile: "",  children: ["kid1", "kid2"]}


1 commentaires

Vous fusionnez deux objets simples (a.k.a. POJO). «JSON» fait référence à une représentation sous forme de chaîne de ceux-ci. (être pédant pour la 2ème fois sur cette page, désolé). Quoi qu'il en soit, question votée pour être claire et légitime.


4 Réponses :


2
votes

Vous pouvez effectuer une fusion à l'aide de l'opérateur de diffusion javascript qui est introduit à partir de ES6.

var obj1 = {id: 1, first_name: "abc", surname: "def", children: ["kid1", "kid2"]}

var obj2 = {first_name: "abc", surname: "def", email: "abc.def@gmail.com", mobile: ""}

var mergedObj = {...obj1,...obj2};


2 commentaires

Pour plus d'informations sur l'opérateur de diffusion, cliquez ici geeksforgeeks.org/javascript-spread-operator


Par souci de pédanterie, l ' opérateur de diffusion pour les littéraux d'objet a été introduit dans ES2018 (donc non disponible dans ES6)



3
votes

La documentation semble indiquer que vous utilisez correctement immutable.merge ().

Malheureusement, cette fonctionnalité semble défectueuse, comme on peut le voir sur leur exemple en direct .

Je conseillerais de soumettre un problème / pull-request pour résoudre ce problème, mais il semble que immuable est maintenant essentiellement non maintenu - le dépôt contient 26 demandes d'extraction ouvertes, et aucune n'a été fusionnée le mois dernier.


Quoi qu'il en soit, je dirais que cela peut très bien avec ES6 + JS. Immuable était en quelque sorte un incontournable avant cela, car JS n'offrait pas les outils adéquats prêts à l'emploi pour ce paradigme.

Si c'est une option (ou même si ce n'est pas le cas, ce qui suit fonctionnera comme prévu), considérez la suggestion de @ AlwinJose d'utiliser le syntaxe de diffusion pour les littéraux d'objet , disponible depuis ES2018:

var mergedObj = {...obj1,...obj2};

(effectue une fusion superficielle , tout comme Object.assign )


3 commentaires

Hugo, merci pour votre réponse. Je vais soulever un problème. Pour l'instant, je vais de l'avant avec la solution ES6


* toux * ES2018 * toux *


Il est peu probable qu'il soit résolu de si tôt, mais si vous voulez soulever le problème, allez-y :) au moins, il sera documenté



0
votes

Si vous commencez par des POJO et que vous souhaitez terminer par un POJO, je vous recommande d'utiliser la syntaxe de propagation d'objets (ou Object.assign ) comme mentionné ci-dessus. Il n'est pas nécessaire d'utiliser Immuable dans ce cas.

Si vous souhaitez utiliser Immutable et que vous savez que obj1 et obj2 sont des objets, vous pouvez appeler Map (obj2) .merge (obj1) < / code> à la place, ce qui fonctionne définitivement. (Basé sur une utilisation répandue dans notre base de code.)

Sinon, la documentation prétend que vous pouvez appeler Immutable.merge avec des POJO, donc vous pourriez avoir plus de chance avec Immutable.merge (obj2, obj1) , en laissant de côté les appels à Immutable.fromJS .


0 commentaires

0
votes

exampleData=

        let hashData = new Map();

        json1.concat(json2).forEach(function (obj) {
            hashData.set(obj.id, Object.assign(hashData.get(obj.id) || {}, obj))
        });

        const finalData2 = Array.from(hashData.values());

example1=

        const finalData1 = json1.concat(json2).reduce(function (index, obj) {
            index[obj.id] = Object.assign({}, obj, index[obj.id]);
            return index;
        }, []).filter(function (res, obj) {
            return obj;
        });

example2=

        const json1 = [
            {id: 1, test: 1},
            {id: 2, test: 2},
            {id: 3, test: 3},
            {id: 4, test: 4},
            {id: 5, test: 5}
        ];

        const json2 = [
            {id: 3, test: 6},
            {id: 4, test: 7},
            {id: 5, test: 8},
            {id: 6, test: 9},
            {id: 7, test: 10}
        ];

Je recommande le deuxième exemple, c'est plus rapide.


0 commentaires