Using Array.prototype.reduce
, you can generating new object by grouping the current input array by faculty._id
as object key, and based on that, you can calculate the totalWarnedLength
and totalClassSize
for same object keys.
const input = [{
"faculty": {
"_id": "5f9c3e04e5a5423cec34b2e2",
"code": "khmt",
"facultyName": "Computer Science"
},
"classSize": 91,
"warnedLength": 61
},
{
"faculty": {
"_id": "5f9c53c8a0db8f4240ec6f71",
"code": "dtvt",
"facultyName": "Electronics and Telecommunication"
},
"classSize": 89,
"warnedLength": 44
},
{
"faculty": {
"_id": "5f9c53c8a0db8f4240ec6f71",
"code": "dtvt",
"facultyName": "Electronics and Telecommunication"
},
"classSize": 59,
"warnedLength": 20
},
{
"faculty": {
"_id": "5f9c53c8a0db8f4240ec6f71",
"code": "hkvt",
"facultyName": "Space Airline"
},
"classSize": 10,
"warnedLength": 5
},
{
"faculty": {
"_id": "5f9c53c8a0db8f4240ec6f71",
"code": "hkvt",
"facultyName": "Space Airline"
},
"classSize": 20,
"warnedLength": 10
},
{
"faculty": {
"_id": "5f9c53c8a0db8f4240ec6f71",
"code": "hkvt",
"facultyName": "Space Airline"
},
"classSize": 30,
"warnedLength": 15
}
];
const groupBy = input.reduce((acc, cur) => {
if (acc[cur.faculty['_id']]) {
acc[cur.faculty['_id']].totalClassSize += cur.classSize;
acc[cur.faculty['_id']].totalWarnedLength += cur.warnedLength;
} else {
acc[cur.faculty['_id']] = {
faculty: cur.faculty,
totalClassSize: cur.classSize,
totalWarnedLength: cur.warnedLength
};
}
return acc;
}, {});
const output = Object.values(groupBy);
console.log(output);
CLICK HERE to find out more related problems solutions.