2017-09-01 7 views
0

J'ai deux tableaux:Comment fusionner deux tableaux en fonction de la valeur de la propriété en réaction avec ES6

a = [{"sourceId": "1", "targetId": "2", "name": "heats air"} , 
     {"sourceId": "3", "targetId": "4", "name": "power"}] 

b = [{"name": "Hair Dryer", "id": "1"}, 
     {"name": "Heating System", "id": "2"}, 
     {"name": "Mains", "id": "3"}, 
     {"name": "Blower", "id": "4"}] 

Comment puis-je obtenir la sortie comme ceci:

[{"sourceId": "1", "targetId": "2", "name": "heats air", "from": "Hair Dryer", "to": "Heating System"}, 
{"sourceId": "3", "targetId": "4", "name": "power","from": "Mains", "to": "Blower"] 

Je veux les fusionner en fonction des valeurs de propriété: les clés "sourceId" et "targetId" du tableau a doivent correspondre à la clé "id" du tableau b. Si un ID source est associé à un ID, ajoutez la valeur du nom avec la clé "from" à l'objet dans le tableau a; Si un ID cible est associé à un ID, ajoutez la valeur du nom avec la clé "à" à l'élément dans le tableau a. Aussi, je me demande si je peux le faire sans utiliser lodash. (En utilisant ES6)

+1

On ne sait pas ce que l'algorithme de fusion est censé être les objets qui se sont fusionnés pas de propriétés communes. Comment déterminez-vous ce qui fusionne avec quoi? Veuillez décrire "en mots" ce qu'est l'algorithme de fusion. Et, comment déterminez-vous de quoi 'from' et' to' devraient être réglés? – jfriend00

+0

Les clés "sourceId" et "targetId" du tableau a doivent correspondre à la clé "id" du tableau b. – hypha

+0

S'il vous plaît modifier votre question pour ajouter l'algorithme de fusion à votre question. Décrivez également comment 'from' et' to' sont supposés être définis. Les commentaires ne doivent pas être utilisés pour les informations requises - ces informations doivent être ajoutées à la question elle-même. – jfriend00

Répondre

1

Convertir b à un Map de id-name utilisant Array#reduce. Puis Array#mapa à la forme désirée à l'aide Object#assign et le bMap:

const a = [{"sourceId":"1","targetId":"2","name":"heats air"},{"sourceId":"3","targetId":"4","name":"power"}]; 
 

 
const b = [{"name":"Hair Dryer","id":"1"},{"name":"Heating System","id":"2"},{"name":"Mains","id":"3"},{"name":"Blower","id":"4"}]; 
 

 
const bMap = b.reduce((map, item) => map.set(item.id, item.name), new Map); 
 

 
const result = a.map((item) => (Object.assign({ 
 
    from: bMap.get(item.sourceId), 
 
    to: bMap.get(item.targetId) 
 
}, item))); 
 

 
console.log(result);

-1

ab [index] = Object.assign (a [index], [index] b)

+0

Cela ne produit pas le résultat souhaité. Notez qu'il y a de nouvelles propriétés ajoutées aux résultats comme dans "from" et "to". – jfriend00

+0

Cela suppose que les deux tableaux sont identiques en longueur et en ordre. – lux

0

vous allez ici.

const a = [{"sourceId": "1", "targetId": "2", "name": "heats air"} , 
 
     {"sourceId": "3", "targetId": "4", "name": "power"}] 
 

 
const b = [{"name": "Hair Dryer", "id": "1"}, 
 
     {"name": "Heating System", "id": "2"}, 
 
     {"name": "Mains", "id": "3"}, 
 
     {"name": "Blower", "id": "4"}] 
 
     
 
const result = a.reduce((arr, curr) => { 
 
    \t const from = b.filter(bObj => { 
 
    \t return bObj.id === curr.sourceId; 
 
    })[0] 
 
    const to = b.filter(bObj => { 
 
    \t return bObj.id === curr.targetId; 
 
    })[0]; 
 
    arr.push({ ...curr, from: from.name, to: to.name }); 
 
    return arr; 
 
}, []); 
 
    
 
console.log(result);