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

如何调整代码实现按姓氏首字母分组渲染用户名录,避免重复标题

解决方案

问题原因

你现在的代码在遍历每个用户时,无论首字母是否发生变化,都会插入一次首字母标题和独立的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:57:02