khukho
khukho

Reputation: 476

How to group some properties of objects based on other property

I have a json response from the database like below:

"gradings": [
    {
        "gradingId": 1,
        "enrollment": {
            "enrollmentId": 1,
            "rollNo": "1PC-1"
        },
        "grade": {
            "name": "B-"
        }
    },
    {
        "gradingId": 2,
        "enrollment": {
            "enrollmentId": 1,
            "rollNo": "1PC-1"
        },
        "grade": {
            "name": "A+"
        }
    },
    {
        "gradingId": 3,
        "enrollment": {
            "enrollmentId": 2,
            "rollNo": "1PC-2"
        },
        "grade": {
            "name": "C-"
        }
    },
    {
        "gradingId": 4,
        "enrollment": {
            "enrollmentId": 2,
            "rollNo": "1PC-2"
        },
        "grade": {
            "name": "C-"
        }
    }
]

What I need is to transform above object into below structure:

I want to group grades in an array for the same enrollmentId.

"gradings": [
    {
      enrollmentId: 1,
      rollNo: "1PC-1",
      grades: [B-, A+]
    },
    {
      enrollmentId: 2,
      rollNo: "1PC-2",
      grades: [C-, C-]
    }
  ]

I didn't see any proper solution to get my requirements and I searched for lodash also.

What should I do? How can I achieve this? Thanks.

Upvotes: 0

Views: 34

Answers (1)

hgb123
hgb123

Reputation: 14891

You should group grades by enrollmentId, have a array storing unique enrollments, map through that array and then complement the grades of that enrollment

Below solution (in vanilla js) could help you

const { gradings } = {
  gradings: [
    {
      gradingId: 1,
      enrollment: {
        enrollmentId: 1,
        rollNo: "1PC-1",
      },
      grade: {
        name: "B-",
      },
    },
    {
      gradingId: 2,
      enrollment: {
        enrollmentId: 1,
        rollNo: "1PC-1",
      },
      grade: {
        name: "A+",
      },
    },
    {
      gradingId: 3,
      enrollment: {
        enrollmentId: 2,
        rollNo: "1PC-2",
      },
      grade: {
        name: "C-",
      },
    },
    {
      gradingId: 4,
      enrollment: {
        enrollmentId: 2,
        rollNo: "1PC-2",
      },
      grade: {
        name: "C-",
      },
    },
  ],
}

const enrollmentById = {}
const gradesByEnrollmentId = {}

gradings.forEach((grading) => {
  if (!gradesByEnrollmentId[grading.enrollment.enrollmentId]) {
    gradesByEnrollmentId[grading.enrollment.enrollmentId] = [grading.grade.name]
  } else {
    gradesByEnrollmentId[grading.enrollment.enrollmentId].push(grading.grade.name)
  }

  if (!enrollmentById[grading.enrollment.enrollmentId]) {
    enrollmentById[grading.enrollment.enrollmentId] = { ...grading.enrollment }
  }
})

const res = {
  gradings: Object.values(enrollmentById).map((enrollment) => ({
    ...enrollment,
    grades: gradesByEnrollmentId[enrollment.enrollmentId],
  })),
}

console.log(res)

Upvotes: 1

Related Questions