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.

Leave a Comment

Your email address will not be published.

Scroll to Top