值得一看
广告
彩虹云商城
广告

热门广告位

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

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

这段代码的含义是:

立即学习“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=>
'<div><label>Select All Studentds <input type="checkbox" class="group"></label><br>'
+grp.map(s=>`<label><input type="checkbox">${s}</label>`).join("<br>")+'</div>').join("");

这段代码的含义是:

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

  1. document.getElementById(“container”): 获取 ID 为 “container” 的 HTML 元素。这个元素将用于显示生成的内容。
  2. Object.values(result): Object.values() 方法返回一个数组,其中包含 result 对象的所有值(即,按 Student.Id 分组的学生姓名数组)。
  3. .map(grp => …): 对每个学生姓名数组(grp)进行映射,生成一个包含 HTML 结构的字符串。
    • ‘<div><label>Select All Studentds <input type=”checkbox” class=”group”></label><br>’: 为每个分组创建一个 div 元素,并在其中添加一个 “Select All Studentds” 的标签和一个复选框。 这个复选框的 class 设置为 “group”,稍后将用于实现 “全选” 功能。
    • grp.map(s =>).join(“<br>”): 对当前分组中的每个学生姓名 (s) 进行映射,生成一个包含复选框和学生姓名的标签。 然后使用 <br> 将这些标签连接起来,形成一个垂直排列的列表。
    • ‘</div>’: 关闭 div 元素。
  4. .join(“”): 将所有生成的 HTML 字符串连接成一个完整的字符串。
  5. 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 属性相同的值。 这样,当点击 “全选” 复选框时,该组的所有复选框都会被选中或取消选中。

完整代码示例

<!DOCTYPE html>
<html>
<head>
<title>JavaScript Grouping and Select All</title>
</head>
<body>
<div id="container"></div>
<script>
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"}}]};
const result = res.List.reduce((a,c,i)=>{
(a[c.Student.Id]??=[]).push(c.Student.Name);
return a;
},{});
document.getElementById("container").innerHTML=
Object.values(result).map(grp=>
'<div><label>Select All Studentds <input type="checkbox" class="group"></label><br>'
+grp.map(s=>`<label><input type="checkbox">${s}</label>`).join("<br>")+'</div>').join("");
document.querySelectorAll(".group").forEach(cb=>
cb.addEventListener("click",()=>cb.closest("div").querySelectorAll(" [type=checkbox]").forEach(c=>c.checked=cb.checked)))
</script>
</body>
</html>

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

注意事项

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

总结

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

温馨提示: 本文最后更新于2025-09-01 10:43:17,某些文章具有时效性,若有错误或已失效,请在下方留言或联系在线客服
文章版权声明 1 本网站名称: 创客网
2 本站永久网址:https://new.ie310.com
1 本文采用非商业性使用-相同方式共享 4.0 国际许可协议[CC BY-NC-SA]进行授权
2 本站所有内容仅供参考,分享出来是为了可以给大家提供新的思路。
3 互联网转载资源会有一些其他联系方式,请大家不要盲目相信,被骗本站概不负责!
4 本网站只做项目揭秘,无法一对一教学指导,每篇文章内都含项目全套的教程讲解,请仔细阅读。
5 本站分享的所有平台仅供展示,本站不对平台真实性负责,站长建议大家自己根据项目关键词自己选择平台。
6 因为文章发布时间和您阅读文章时间存在时间差,所以有些项目红利期可能已经过了,能不能赚钱需要自己判断。
7 本网站仅做资源分享,不做任何收益保障,创业公司上收费几百上千的项目我免费分享出来的,希望大家可以认真学习。
8 本站所有资料均来自互联网公开分享,并不代表本站立场,如不慎侵犯到您的版权利益,请联系79283999@qq.com删除。

本站资料仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
THE END
喜欢就支持一下吧
点赞13赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容