如何基于其他属性对对象的某些属性进行分组

时间:2020-08-15 15:26:13

标签: javascript object lodash

我从数据库收到一个json响应,如下所示:

"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-"
        }
    }
]

我需要的是将上方对象转换为下方结构:

我想在一个数组中为相同的 enrollmentId 分组成绩

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

我没有找到满足要求的合适解决方案,我也在搜索lodash。

我该怎么办?我该如何实现?谢谢。

1 个答案:

答案 0 :(得分:1)

您应按enrollmentId对成绩进行分组,有一个存储唯一入学申请的数组,map贯穿该数组,然后补充该入学成绩

以下解决方案(适用于Vanilla js)可以为您提供帮助

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)