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

问题描述

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

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

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

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

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

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

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

解决方法

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

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

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

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)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...