You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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逻辑不熟悉,可以拆分为两步完成:

  1. 提取所有唯一的secId
  2. 遍历每个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:05:13