【问题标题】:How to group some properties of objects based on other property如何根据其他属性对对象的某些属性进行分组
【发布时间】:2020-12-05 05:21:28
【问题描述】:

我有一个来自数据库的 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-"
        }
    }
]

我需要将上面的对象转换成下面的结构:

我想将 grades 分组到一个数组中以获得相同的 enrollmentId

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

我没有看到任何合适的解决方案来满足我的要求,我也搜索了 lodash。

我该怎么办?我怎样才能做到这一点?谢谢。

【问题讨论】:

    标签: javascript object lodash


    【解决方案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)

    【讨论】:

      猜你喜欢
      • 2021-11-14
      • 1970-01-01
      • 2022-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-09
      • 2015-11-16
      • 1970-01-01
      相关资源
      最近更新 更多