如何用JavaScript基于三个对象数组生成目标新对象?
JavaScript对象数组合并方案
现有三个对象数组COURSES、ADMISSION_DETAILS、ATTENDANCE,需要合并生成指定结构的新对象数组,以下是实现方案:
原数据
const COURSES=[ { PROGRAM: "BTech", COURSE: 'PHYSICS', FEE:200 }, { PROGRAM: "BTech", COURSE: 'CHEMISTRY', FEE:200 }, { PROGRAM: "BTech", COURSE: 'BIOLOGY', FEE:200 } ] const ADMISSION_DETAILS=[ { NAME:'AJU', REGISTER_NUMBER:'JAJEGJAFD512315', EMAIL:'xxxxxasdf@gmail.com', PHONE:'974654645454' } ] const ATTENDANCE = [ { NAME: 'AJU', REGISTER_NUMBER: 'JAJEGJAFD512315', ATTENDANCE:{ PHYSICS:75, CHEMISTRY:86, BIOLOGY:40 } } ]
期望输出
const desired_output=[ { NAME:'AJU', REGISTER_NUMBER:'JAJEGJAFD512315', EMAIL:'xxxxxasdf@gmail.com', PHONE:'974654645454', PROGRAM: "BTech", COURSE:"PHYSICS", ATTENDANCE:75, FEE:200, }, { NAME:'AJU', REGISTER_NUMBER:'JAJEGJAFD512315', EMAIL:'xxxxxasdf@gmail.com', PHONE:'974654645454', PROGRAM: "BTech", COURSE:"CHEMISTRY", ATTENDANCE:86, FEE:200 }, { NAME:'AJU', REGISTER_NUMBER:'JAJEGJAFD512315', EMAIL:'xxxxxasdf@gmail.com', PHONE:'974654645454', PROGRAM: "BTech", COURSE:"BIOLOGY", ATTENDANCE:40, FEE:200 } ]
实现代码
// 构建出勤数据映射,通过学号快速查找对应课程出勤 const attendanceMap = new Map(); ATTENDANCE.forEach(item => { attendanceMap.set(item.REGISTER_NUMBER, item.ATTENDANCE); }); // 合并生成目标数组 const desired_output = ADMISSION_DETAILS.flatMap(student => { const studentAttendance = attendanceMap.get(student.REGISTER_NUMBER) || {}; return COURSES.map(course => ({ // 展开学生基础信息 ...student, // 添加课程相关字段 PROGRAM: course.PROGRAM, COURSE: course.COURSE, FEE: course.FEE, // 匹配对应课程的出勤数据,无数据时默认0 ATTENDANCE: studentAttendance[course.COURSE] || 0 })); }); console.log(desired_output);
思路说明
- 构建出勤映射:将
ATTENDANCE数组转换为以REGISTER_NUMBER为键的Map,避免每次查找出勤数据时遍历数组,提升效率。 - 生成多课程记录:使用
flatMap遍历每个学生,对每门课程生成一条包含学生信息、课程信息和对应出勤数据的记录,flatMap自动将嵌套数组展平为一维数组。 - 容错处理:当某门课程没有对应出勤数据时,默认设置为0,可根据实际需求调整默认值。
内容的提问来源于stack exchange,提问作者amal m reji
相关产品推荐
相关产品推荐

