Node.js中多嵌套数组按class_id分组合并学生数据求助
按class_id分组嵌套学生数据的解决方案
原始数据
[ [ { class_id: "Grade 1", roll_number: "1", name: "alex" }, { class_id: "Grade 1", roll_number: "2", name: "bob" }, ], [ { class_id: "Grade 2", roll_number: "7", name: "peter" }, { class_id: "Grade 3", roll_number: "6", name: "lia" }, { class_id: "Grade 2", roll_number: "5", name: "mary" }, { class_id: "Grade 3", roll_number: "1", name: "violet" }, ], ]
需求格式
[ { class_id: "Grade 1", students: [ { roll_number: "1", name: "alex" }, { roll_number: "2", name: "bob" }, ], }, { class_id: "Grade 2", students: [ { roll_number: "7", name: "peter" }, { roll_number: "5", name: "mary" }, ], }, { class_id: "Grade 3", students: [ { roll_number: "6", name: "lia" }, { roll_number: "1", name: "violet" }, ], }, ]
现有代码问题
你尝试的代码存在两个核心问题:
- 假设每个子数组仅对应一个
class_id,无法处理同一子数组内多个不同class_id的情况 - 输出的字段名是
studentsList,和需求的students不匹配
现有代码:
var response = []; data.map(item => { var students = []; for (var i = 0; i < item.length; i++) { const stu_obj = { name: item[i].name, roll_number: item[i].roll_number, }; students.push(stu_obj); if (i == 0) { const class_obj = { class_id: item[0].class_id, studentsList: students, }; response.push(class_obj); continue; } } });
解决方案
步骤说明
- 扁平化嵌套数组:先把两层嵌套的学生数组转换成一维数组,统一处理所有学生对象
- 按class_id分组:使用临时对象存储每个班级对应的学生列表
- 转换为目标格式:把分组后的对象转成需求的数组结构
代码实现
// 扁平化嵌套数组(现代环境支持) const flattenedData = data.flat(); // 按class_id分组 const classGroups = flattenedData.reduce((groups, student) => { // 解构出class_id和剩余的学生信息 const { class_id, ...studentInfo } = student; // 如果当前班级不存在,初始化空数组 if (!groups[class_id]) { groups[class_id] = []; } // 添加学生信息到对应班级 groups[class_id].push(studentInfo); return groups; }, {}); // 转换为目标数组格式 const result = Object.entries(classGroups).map(([class_id, students]) => ({ class_id, students })); console.log(result);
兼容低版本环境的扁平化方案
如果运行环境不支持Array.flat(),可以用reduce手动扁平化:
const flattenedData = data.reduce((acc, subArray) => acc.concat(subArray), []);
内容的提问来源于stack exchange,提问作者sumitra_gangula
相关产品推荐
相关产品推荐

