如何调整代码实现按姓氏首字母分组渲染用户名录,避免重复标题
解决方案
问题原因
你现在的代码在遍历每个用户时,无论首字母是否发生变化,都会插入一次首字母标题和独立的ul列表,导致同一个首字母的标题重复出现。由于你的源数据已经提前按姓氏完成排序,仅需对比相邻用户的首字母,仅在首字母变化时新增分组标题即可。
修正后代码
// 先统一解析、排序数据,避免重复解析浪费性能 const userList = JSON.parse(data).sort(function (a, b) { return a.user_last.localeCompare(b.user_last); }); // 清空容器,避免重复渲染 const $watchWindow = $("#watching-window").empty(); // 记录上一个分组的首字母 let lastLetter = ''; // 记录当前分组的ul容器 let $currentUl = null; $.each(userList, function (i, item) { // 过滤socket_id为0的用户 if (item.socket_id === '0') return; // 取姓氏首字母,统一转大写避免大小写分组错误 const currentLetter = item.user_last.charAt(0).toUpperCase(); // 首字母变化时新增分组 if (currentLetter !== lastLetter) { // 插入首字母标题 $watchWindow.append(`<div class="letter">${currentLetter}</div>`); // 新建当前分组的ul容器 $currentUl = $('<ul></ul>').appendTo($watchWindow); // 更新上一个首字母标记 lastLetter = currentLetter; } // 把当前用户插入到当前分组的ul中 $currentUl.append(`<li>${item.user_title} ${item.user_first} ${item.user_last}</li>`); }); // 统一做淡入效果 $watchWindow.fadeIn(400);
实现逻辑说明
- 提前一次性解析、排序数据,避免循环中重复执行
JSON.parse导致的性能损耗 - 新增
lastLetter变量记录上一个分组的首字母,只有当前用户首字母和上一个不同时,才新增首字母标题和ul容器 - 首字母统一转大写处理,避免大小写不同(如
B和b)导致同一个首字母被拆分成两个分组 - 所有用户信息插入完成后统一执行淡入效果,避免频繁触发动画导致的卡顿
内容的提问来源于stack exchange,提问作者Dror Shalit
相关产品推荐
相关产品推荐

