如何将Express API返回的学生数据按secId分组转换格式?
JavaScript实现学生数据按secId分组转换
我从Express API获取了一组学生数据,输入格式如下:
const input = [ { secId: "12", stuName: "aaa", stuGrade: "A", stuTotal: 100 }, { secId: "12", stuName: "bbb", stuGrade: "A+", stuTotal: 98 }, { secId: "13", stuName: "ccc", stuGrade: "B", stuTotal: 95 }, { secId: "13", stuName: "ddd", stuGrade: "A", stuTotal: 70 }, ];
需要将其转换为按secId分组的格式,每个分组包含对应学生详情的stuDetails数组,输出格式如下:
const output = [ { secId: 12, stuDetails: [ { stuName: "aaa", stuGrade: "A", stuTotal: 100 }, { stuName: "bbb", stuGrade: "A+", stuTotal: 98 }, ], }, { secId: 13, stuDetails: [ { stuName: "ccc", stuGrade: "B", stuTotal: 95 }, { stuName: "ddd", stuGrade: "A", stuTotal: 70 }, ], }, ];
实现方法
方法一:使用Array.reduce()(推荐)
reduce是处理这类分组需求最简洁高效的方式,通过一次遍历即可完成分组:
const input = [ { secId: "12", stuName: "aaa", stuGrade: "A", stuTotal: 100 }, { secId: "12", stuName: "bbb", stuGrade: "A+", stuTotal: 98 }, { secId: "13", stuName: "ccc", stuGrade: "B", stuTotal: 95 }, { secId: "13", stuName: "ddd", stuGrade: "A", stuTotal: 70 }, ]; // 用reduce构建分组对象 const groupedMap = input.reduce((acc, item) => { const secId = Number(item.secId); // 初始化分组(如果不存在) if (!acc[secId]) { acc[secId] = { secId, stuDetails: [] }; } // 提取学生详情(剔除secId) const { secId: _, ...stuDetail } = item; acc[secId].stuDetails.push(stuDetail); return acc; }, {}); // 将分组对象转为数组,得到最终结果 const output = Object.values(groupedMap); console.log(output);
方法二:分步实现(适合新手理解)
如果对reduce逻辑不熟悉,可以拆分为两步完成:
- 提取所有唯一的
secId - 遍历每个
secId,筛选对应学生并整理详情
const input = [ { secId: "12", stuName: "aaa", stuGrade: "A", stuTotal: 100 }, { secId: "12", stuName: "bbb", stuGrade: "A+", stuTotal: 98 }, { secId: "13", stuName: "ccc", stuGrade: "B", stuTotal: 95 }, { secId: "13", stuName: "ddd", stuGrade: "A", stuTotal: 70 }, ]; // 提取唯一的secId并转为数字类型 const uniqueSecIds = [...new Set(input.map(item => Number(item.secId)))]; // 构建最终分组数组 const output = uniqueSecIds.map(secId => { const stuDetails = input .filter(item => Number(item.secId) === secId) .map(({ secId: _, ...detail }) => detail); return { secId, stuDetails }; }); console.log(output);
内容的提问来源于stack exchange,提问作者B Thiru Yogeshwaran
相关产品推荐
相关产品推荐

