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

JavaScript中按Student.Id分组并添加全选项的实现方法

按Student.Id分组并添加组内全选选项

问题描述

我从数据库获取了res.List数组,存储了所有记录信息。目前尝试用for循环处理数组,需要按Student.Id对记录分组,并在每组顶部添加带复选框的“全选学生”选项。现有代码片段、示例数据及期望结果如下:

现有代码

for(i=0;i<res.length;i++)
{
   res.List[i].Student.Id // 此处获取每条记录的ID
   // 需要为相同ID的记录组添加全选项,例如ID为1、5、7的各组都要添加
}

示例数据(res.List)

>0
.School information : {RegId: 1,Name : "SJ"}
.ParentInfo : {Id:0,Name:"Abc"}
.Student : {Id:1,Name:"Student1"}

>1
.School information : {RegId: 1,Name : ""}
.ParentInfo : {Id:0,Name:""}
.Student : {Id:5,Name:"Student6"}

>2
.School information : {RegId: 1,Name : ""}
.ParentInfo : {Id:0,Name:""}
.Student : {Id:1,Name:"Student3"}

>3
.School information : {RegId: 1,Name : ""}
.ParentInfo : {Id:0,Name:""}
.Student : {Id:5,Name:"Student5"}

>4
.School information : {RegId: 1,Name : ""}
.ParentInfo : {Id:0,Name:""}
.Student : {Id:1,Name:"Student4"}

>5
.School information : {RegId: 1,Name : ""}
.ParentInfo : {Id:0,Name:""}
.Student : {Id:7,Name:"Student9"}

>6
.School information : {RegId: 1,Name : ""}
.ParentInfo : {Id:0,Name:""}
.Student : {Id:7,Name:"Student11"}

期望结果

<input type="checkbox"> 全选学生
Student1
Student3
Student4

<input type="checkbox"> 全选学生
Student5
Student6

<input type="checkbox"> 全选学生
Student9
Student11

解决方案

方法1:使用Map分组(高效简洁)

先通过Map将相同Student.Id的学生归类,再遍历Map生成带全选选项的分组内容:

// 1. 按Student.Id分组,收集对应学生姓名
const grouped = new Map();
res.List.forEach(item => {
  const id = item.Student.Id;
  const name = item.Student.Name;
  if (!grouped.has(id)) {
    grouped.set(id, []);
  }
  grouped.get(id).push(name);
});

// 2. 生成带全选选项的结果
let output = '';
grouped.forEach(students => {
  // 添加组顶部的全选复选框
  output += `<input type="checkbox" onclick="toggleSelectAll(this)"> 全选学生\n`;
  // 添加组内所有学生
  students.forEach(name => {
    output += `${name}\n`;
  });
  // 组之间添加空行分隔
  output += '\n';
});

// 输出最终结果(去除末尾多余空行)
console.log(output.trim());

方法2:使用for循环实现(贴合你的初始思路)

如果偏好使用for循环,需要先将数组按Student.Id排序,确保同组记录连续,再遍历判断组的切换:

// 1. 先按Student.Id排序,确保同ID记录连续
res.List.sort((a, b) => a.Student.Id - b.Student.Id);

let output = '';
let currentId = null;

// 2. 遍历数组生成分组
for (let i = 0; i < res.List.length; i++) {
  const item = res.List[i];
  const id = item.Student.Id;
  const name = item.Student.Name;

  // 切换到新组时,添加全选选项
  if (id !== currentId) {
    if (currentId !== null) {
      // 非首个组,先加空行分隔
      output += '\n';
    }
    output += `<input type="checkbox" onclick="toggleSelectAll(this)"> 全选学生\n`;
    currentId = id;
  }

  // 添加当前学生姓名
  output += `${name}\n`;
}

console.log(output.trim());

补充:全选复选框的联动逻辑(可选)

如果需要实现点击“全选”时选中组内所有学生(假设后续会给学生项也加复选框),可以添加如下函数:

function toggleSelectAll(checkbox) {
  // 获取当前组内的所有学生复选框(需根据实际DOM结构调整选择器)
  const group = checkbox.parentElement;
  const studentCheckboxes = group.querySelectorAll('.student-checkbox');
  
  studentCheckboxes.forEach(cb => {
    cb.checked = checkbox.checked;
  });
}

内容的提问来源于stack exchange,提问作者Nickname

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 20:43:21