使用JavaScript处理JSON对象数组内嵌数组,按学生聚合所属课程生成新数组
实现方案
核心思路
- 先建立一个以学生姓名为key的哈希映射,存储每个学生对应的选课列表,避免重复遍历比对,时间复杂度为O(N)(N为所有课程下的学生总数量)
- 遍历所有课程,将当前课程名追加到对应学生的选课列表中
- 最后将哈希映射转换为要求的数组结构即可
完整代码
let studentArray = [{ "name": "Computer Science", "students": [{ "student_name": "A" }, { "student_name": "B" } ] }, { "name": "Math", "students": [{ "student_name": "A" }, { "student_name": "B" }, { "student_name": "C" } ] } ] // 初始化哈希映射存储学生选课信息 const studentMap = {} // 遍历所有课程 studentArray.forEach(course => { const courseName = course.name // 遍历当前课程下的所有学生 course.students.forEach(student => { const stuName = student.student_name // 如果学生不在映射中,初始化选课数组 if (!studentMap[stuName]) { studentMap[stuName] = [] } // 把当前课程加入学生的选课列表 studentMap[stuName].push(courseName) }) }) // 把哈希映射转为要求的数组格式 const result = Object.keys(studentMap).map(name => ({ student_name: name, courses: studentMap[name] })) console.log(result)
原代码问题说明
你原有代码无法得到正确结果的原因有两个:
- 逻辑方向错误:你在比对相邻课程的学生列表,没有按照「学生维度聚合课程」的核心需求设计逻辑
- 字段匹配错误:
comparer函数中比对的value和display字段在你的原始数据中不存在,原始数据学生对象只有student_name字段
内容的提问来源于stack exchange,提问作者Er Pankaj Dhumal
相关产品推荐
相关产品推荐

