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

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;
    }
  }
});

解决方案

步骤说明

  1. 扁平化嵌套数组:先把两层嵌套的学生数组转换成一维数组,统一处理所有学生对象
  2. 按class_id分组:使用临时对象存储每个班级对应的学生列表
  3. 转换为目标格式:把分组后的对象转成需求的数组结构

代码实现

// 扁平化嵌套数组(现代环境支持)
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 17:16:08