Udaya kumar
Udaya kumar

Reputation: 11

Build a JSON array of objects in node JS

I would like to build a JSON structure as below

{
  "employee": {
    "hireDate": "01/01/2000",
    "serviceDate": "01/01/2000",
    "employeeDetails": [
      {
        "roleName": "Analyst",
        "beginDate": "01/01/2000",
        "endDate": "12/31/2001",
        "status": "Active"
      },
      {
        "roleName": "Developer",
        "beginDate": "01/01/2002",
        "endDate": "01/01/2021",
        "status": "Active"
      }
    ],
    "name": [
      {
        "firstName": "Jason",
        "lastName": "Washington"
      }
    ]
  }
}

I'm have individual objects information as seperate resultsets from DB2 SQL. I would like to form/ build a JSON structure

Upvotes: 0

Views: 82

Answers (2)

sahil khaire
sahil khaire

Reputation: 79

Here i use one common key name as employer_id in all table result so it will easy to map all result as per employer id

let employee_details =[{
    "employer_id":1,
    "roleName": "Analyst",
    "beginDate": "01/01/2000",
    "endDate": "12/31/2001",
    "status": "Active"
  },{
    "employer_id":1,
    "roleName": "Developer",
    "beginDate": "01/01/2002",
    "endDate": "01/01/2021",
    "status": "Active"
  }
]
let employee_personal_details =[{
   "employer_id":1,
   "firstName": "Jason",
   "lastName": "Washington"
}]

let employee_work_details = [{
    "employer_id":1,
    "hireDate": "01/01/2000",
    "serviceDate": "01/01/2000"
}]

let employee = employee_work_details.map(details=>{
    return {
        ...details,
        employeeDetails: employee_details.filter(_details => _details.employer_id == details.employer_id),
        name: employee_personal_details.filter( personal_details => personal_details.employer_id == details.employer_id)
    }
})
console.log({employee})

Upvotes: 1

Terry Lennox
Terry Lennox

Reputation: 30675

You can use map and reduce to build an array from multiple input arrays.

We match based on some shared id, in this case employeeId.

You could make this behaviour more sophisticated by specifying a join property for each array, let's say name or date of birth.

const employees = [{ id: 1, name: "Mark Ryan" }, { id: 2, name: "Joe Smith" }, { id: 3, name: "Meg Green" }];
const employeeDetails = [{ employeeId: 1, roleName: "Analyst", beginDate: "01/01/2002" }, { employeeId: 1, roleName: "Developer", beginDate: "01/01/2005"  }, { employeeId: 2, roleName: "QA", beginDate: "03/05/2015" }, { employeeId: 3, roleName: "Manager",beginDate: "11/08/2010"  }];
const contactDetails = [{ employeeId: 1, email: "[email protected]" }, { employeeId: 2, phone: "555-009" }, { employeeId: 2, email: "[email protected]" }, { employeeId: 3, email: "[email protected]" }];

const arraysToJoin = [ { employeeDetails } , { contactDetails } ];

const result = employees.map(employee => { 
    return arraysToJoin.reduce( (acc, obj) => {
      acc[Object.keys(obj)[0]] = Object.values(obj)[0].filter(details => acc.id === details.employeeId).map(details => {
          const { employeeId, ...rest } = details;
          return rest;
      });
      return acc;
    }, employee);
});

console.log("Result:",result);

Upvotes: 0

Related Questions