Search code examples
javascriptarraysobjectreduce

Combining two Objects with same properties to array value Javascript


I have two objects, where the second object key is a property of the first (projectID);

**OBJ1** 
[0: { projectID: 1234, prop1: "apple", prop2: "banana", prop3: "choc"},
 1: { projectID: 8765, prop1: "apple", prop2: "banana", prop3: "choc"}] 
**OBJ2**
[1234: {prop1: "gen", prop2: "home", prop3: "home"}, 
8765:{prop1 :"gone", prop2:"done", prop3: "say"}]

I have a function for filtering

Object.keys(OBJ2).forEach( s => OBJ1.filter(d => d.projectID === s) 

I tried reduce to map the two objects but was unsuccessful. The wanted result is :

Desired Result : 
0: {projectID: 1234, prop1: ["apple","gen"], prop2:["banana","home"], prop3:["choc","home"], 
1:{propjectID:8765, prop1:["apple","gone"], prop2:["banan","done"], prop3:["choc","say"]

Any help much appreciated!


Solution

  • Your JSON objects are wrong I have corrected the JSON object assuming that it is your desire Refer the code for the corrected JSON :

    function mergeObjects(originalArray, additionalData) {
      return originalArray.map(item => {
        const projectId = item.projectID;
        const additionalProps = additionalData[projectId];
    
        return {
          projectID: projectId,
          prop1: [item.prop1, additionalProps.prop1],
          prop2: [item.prop2, additionalProps.prop2],
          prop3: [item.prop3, additionalProps.prop3],
        };
      });
    }
    
    // Corrected JSON objects
    const originalArray = [
      {
        "projectID": 1234,
        "prop1": "apple",
        "prop2": "banana",
        "prop3": "choc"
      },
      {
        "projectID": 8765,
        "prop1": "apple",
        "prop2": "banana",
        "prop3": "choc"
      }
    ];
    
    // Corrected object two
    const additionalData = {
      "1234": {
        "prop1": "gen",
        "prop2": "home",
        "prop3": "home"
      },
      "8765": {
        "prop1": "gone",
        "prop2": "done",
        "prop3": "say"
      }
    };
    
    const result = mergeObjects(originalArray, additionalData);
    console.log(JSON.stringify(result));