0

0

JavaScript:按ID分组列表并添加“全选”功能

碧海醫心

碧海醫心

发布时间:2025-08-31 23:52:28

|

846人浏览过

|

来源于php中文网

原创

javascript:按id分组列表并添加“全选”功能

本文旨在提供一种使用 JavaScript 对包含学生信息的列表进行分组,并为每个分组添加“全选”复选框功能的解决方案。通过使用 reduce 方法按 Student.Id 对数据进行分组,然后动态生成 HTML 结构,实现数据的可视化和交互。本文将提供详细的代码示例和解释,帮助开发者理解和应用该技术。

数据准备与分组

首先,我们需要一个包含学生信息的列表。假设我们有以下数据结构:

const res = { List:
[{"School information":{RegId: 1,Name : "SJ"},ParentInfo:{Id:0,Name:"Abc"},Student:{Id:1,Name:"Student1"}},
 {"School information":{RegId: 1,Name : ""},  ParentInfo:{Id:0,Name:""},   Student:{Id:5,Name:"Student6"}},
 {"School information":{RegId: 1,Name : ""},  ParentInfo:{Id:0,Name:""},   Student:{Id:1,Name:"Student3"}},
 {"School information":{RegId: 1,Name : ""},  ParentInfo:{Id:0,Name:""},   Student:{Id:5,Name:"Student5"}},
 {"School information":{RegId: 1,Name : ""},  ParentInfo:{Id:0,Name:""},   Student:{Id:1,Name:"Student4"}},
 {"School information":{RegId: 1,Name : ""},  ParentInfo:{Id:0,Name:""},   Student:{Id:7,Name:"Student9"}},
 {"School information":{RegId: 1,Name : ""},  ParentInfo:{Id:0,Name:""},   Student:{Id:7,Name:"Student11"}}]};

接下来,我们使用 reduce 方法根据 Student.Id 对数据进行分组。reduce 方法接受一个回调函数和一个初始值作为参数。回调函数接收累加器 a、当前值 c 和索引 i 作为参数。

const result = res.List.reduce((a,c,i)=>{
    (a[c.Student.Id]??=[]).push(c.Student.Name);
    return a;
},{});

这段代码的含义是:

东区网上书店
东区网上书店

功能简介:多用户管理分权限发布、管理书籍资料。大类小类两级无限制软件分类、无限制添加书籍资料。资料批量删除、批量分类转移等批量管理功能。采用交互性的订单处理方式客户管理功能会员制度,分VIP会员和一般会员,并提供不同的优惠书本评论、管理功能。完善而方便的书籍资料添加、编辑表单,无组件图片上传。强大的搜索功能,可以按各个字段进行不同方式的高级搜索。付款方式管理网站后台管理员用户名和密码都是:admi

下载

立即学习Java免费学习笔记(深入)”;

  1. res.List.reduce((a, c, i) => { ... }, {}): 使用 reduce 方法遍历 res.List 数组。
  2. a: 累加器,初始值为空对象 {}。它用于存储按 Student.Id 分组的结果。
  3. c: 当前元素,即 res.List 中的一个对象。
  4. i: 当前元素的索引。
  5. (a[c.Student.Id] ??= []): 这部分代码是关键。它首先尝试访问累加器 a 中以 c.Student.Id 为键的属性。
    • 如果该属性不存在(即,之前没有遇到过这个 Student.Id),则使用空数组 [] 作为该属性的初始值,并将其赋值给 a[c.Student.Id]。 ??= 是空值合并赋值运算符,只有当左侧的值为 null 或 undefined 时,才会将右侧的值赋给左侧。
    • 如果该属性已经存在(即,之前已经遇到过这个 Student.Id),则直接使用该属性的值(一个数组)。
  6. .push(c.Student.Name): 将当前学生的姓名 c.Student.Name 添加到对应 Student.Id 的数组中。
  7. return a: 返回更新后的累加器 a,以便在下一次迭代中使用。

经过这段代码的处理,result 对象将包含按 Student.Id 分组的学生姓名列表。例如:

{
  "1": ["Student1", "Student3", "Student4"],
  "5": ["Student6", "Student5"],
  "7": ["Student9", "Student11"]
}

动态生成 HTML

接下来,我们需要将分组后的数据动态生成 HTML 结构,包括“全选”复选框和每个学生的复选框。

document.getElementById("container").innerHTML=
 Object.values(result).map(grp=>
 '

' +grp.map(s=>``).join("
")+'
').join("");

这段代码的含义是:

立即学习Java免费学习笔记(深入)”;

  1. document.getElementById("container"): 获取 ID 为 "container" 的 HTML 元素。这个元素将用于显示生成的内容。
  2. Object.values(result): Object.values() 方法返回一个数组,其中包含 result 对象的所有值(即,按 Student.Id 分组的学生姓名数组)。
  3. .map(grp => ...): 对每个学生姓名数组(grp)进行映射,生成一个包含 HTML 结构的字符串。
    • '

      ': 为每个分组创建一个 div 元素,并在其中添加一个 "Select All Studentds" 的标签和一个复选框。 这个复选框的 class 设置为 "group",稍后将用于实现 "全选" 功能。
    • grp.map(s =>).join("
      "): 对当前分组中的每个学生姓名 (s) 进行映射,生成一个包含复选框和学生姓名的标签。 然后使用
      将这些标签连接起来,形成一个垂直排列的列表。
    • '
': 关闭 div 元素。
  • .join(""): 将所有生成的 HTML 字符串连接成一个完整的字符串。
  • document.getElementById("container").innerHTML = ...: 将生成的 HTML 字符串设置为 "container" 元素的 innerHTML,从而将内容显示在页面上。
  • 实现“全选”功能

    最后,我们需要实现“全选”功能,即点击“全选”复选框时,选中或取消选中该组的所有学生复选框。

    document.querySelectorAll(".group").forEach(cb=>
      cb.addEventListener("click",()=>cb.closest("div").querySelectorAll(" [type=checkbox]").forEach(c=>c.checked=cb.checked)))

    这段代码的含义是:

    立即学习Java免费学习笔记(深入)”;

    1. document.querySelectorAll(".group"): 获取所有 class 为 "group" 的元素(即,所有的 "全选" 复选框)。
    2. .forEach(cb => ...): 遍历每个 "全选" 复选框 (cb)。
    3. cb.addEventListener("click", () => ...): 为每个 "全选" 复选框添加一个点击事件监听器。
    4. cb.closest("div"): 找到当前 "全选" 复选框 (cb) 最近的父级 div 元素。 这个 div 包含了当前分组的所有学生复选框。
    5. cb.closest("div").querySelectorAll(" [type=checkbox]"): 在当前分组的 div 元素中,找到所有类型为 "checkbox" 的元素(包括 "全选" 复选框和学生复选框)。
    6. .forEach(c => c.checked = cb.checked): 遍历当前分组的所有复选框 (c),并将它们的 checked 属性设置为与 "全选" 复选框 (cb) 的 checked 属性相同的值。 这样,当点击 "全选" 复选框时,该组的所有复选框都会被选中或取消选中。

    完整代码示例

    
    
    
      JavaScript Grouping and Select All
    
    
      

    这段代码将生成一个包含分组学生列表和“全选”功能的 HTML 页面。

    注意事项

    • 确保 HTML 结构中存在 ID 为 "container" 的元素,用于显示生成的内容。
    • 代码中的数据结构 res 仅为示例,实际应用中需要根据实际数据结构进行调整。
    • 可以根据需要自定义 HTML 结构和样式。

    总结

    本文介绍了一种使用 JavaScript 对包含学生信息的列表进行分组,并为每个分组添加“全选”复选框功能的解决方案。通过使用 reduce 方法按 Student.Id 对数据进行分组,然后动态生成 HTML 结构,实现数据的可视化和交互。该技术可以应用于各种需要对数据进行分组和批量操作的场景。

    相关专题

    更多
    js获取数组长度的方法
    js获取数组长度的方法

    在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

    557

    2023.06.20

    js刷新当前页面
    js刷新当前页面

    js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

    395

    2023.07.04

    js四舍五入
    js四舍五入

    js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

    756

    2023.07.04

    js删除节点的方法
    js删除节点的方法

    js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

    478

    2023.09.01

    JavaScript转义字符
    JavaScript转义字符

    JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

    494

    2023.09.04

    js生成随机数的方法
    js生成随机数的方法

    js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

    1051

    2023.09.04

    如何启用JavaScript
    如何启用JavaScript

    JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

    659

    2023.09.12

    Js中Symbol类详解
    Js中Symbol类详解

    javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

    554

    2023.09.20

    C++ 高级模板编程与元编程
    C++ 高级模板编程与元编程

    本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

    6

    2026.01.23

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    React 教程
    React 教程

    共58课时 | 4万人学习

    TypeScript 教程
    TypeScript 教程

    共19课时 | 2.4万人学习

    Bootstrap 5教程
    Bootstrap 5教程

    共46课时 | 3万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号