jQuery 多条件排序:按分数降序、时间升序对 div 元素进行复合排序

发布时间 - 2025-12-30 00:00:00    点击率:

本文详解如何使用 jquery 对 dom 元素(如 `.contest_entry`)实现多级排序:优先按 `span.points` 数值**降序排列**,分数相同时再按 `span.times` 字符串(时间格式)**升序排列**,确保结果既准确又符合业务逻辑。

在实际开发中,单字段排序往往无法满足复杂展示需求。例如竞赛榜单需优先显示高分用户,而同分者则按完成时间更早者靠前——这就需要多条件复合排序。jQuery 本身不提供内置多级排序方法,但可通过 Array.prototype.sort() 的比较函数灵活实现。

核心思路是:在比较函数中逐级判断——先比主条件(points),若相等再比次条件(times)。注意两点关键细节:

  1. points 降序:用 rhsPoints - lhsPoints(而非 lhs - rhs),使数值大的排前面;
  2. times 升序:因原始 HTML 中时间为 " 09:55 " 这类带空格的字符串,直接字符串比较(如 "09:55" 天然有效,无需额外解析为 Date 对象(前提是格式统一为 HH:MM)。

以下是优化后的完整可运行代码(已修正原答案中错误的选择器 .child —— 示例 HTML 中并无 .child 容器):

$(function() {
  var sortedList = $('.contest_entry').toArray().sort(function(lhs, rhs) {
    // 提取并解析 points 值(注意 trim() 去除空格)
    var lhsPoints = parseInt($(lhs).find('span.points').text().trim(), 10);
    var rhsPoints = parseInt($(rhs).find('span.points').text().trim(), 10);

    if (lhsPoints === rhsPoints) {
      // points 相等时,按 times 升序:较早时间排前面
      var lhsTime = $(lhs).find('span.times').text().trim();
      var rhsTime = $(rhs).find('span.times').text().trim();
      return lhsTime > rhsTime ? 1 : -1; // 字符串比较,"09:55" < "17:20" → true
    } else {
      // points 降序:高分在前
      return rhsPoints - lhsPoints;
    }
  });

  $("#list").html(sortedList);
});

注意事项与最佳实践:

  • 使用 .trim() 清除 text() 返回的首尾空格,避免 parseInt(" 14 ") 虽可工作,但时间字符串 " 09:55 " 比较时空格可能导致意外结果;
  • 若 times 包含秒(如 "09:55:23")或跨日,建议改用 Date.parse() 或 moment.js 解析为毫秒再比较;
  • 排序后重新插入 DOM 会触发重排(reflow),大量元素时可考虑文档片段(documentFragment)优化性能;
  • 确保所有 .contest_entry 都包含 .points 和 .times 子元素,否则 parseInt(undefined) 会返回 NaN,导致排序异常——生产环境建议添加存在性校验。

最终排序效果示例(基于你的 HTML 数据):
19 分组内按时间升序 → "17:19"、"17:20"、"17:34";
16 分(09:55)排在 19 分之后、14 分(12:39)之前——完全符合「高分优先、同分早到优先」的业务规则。


# jquery  # html  # js  # 排列  # Array  # sort  # date  # 字符串 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在IIS管理器中快速创建并配置网站?  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  青岛网站建设如何选择本地服务器?  Android仿QQ列表左滑删除操作  jquery插件bootstrapValidator表单验证详解  中国移动官方网站首页入口 中国移动官网网页登录  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  高防服务器租用如何选择配置与防御等级?  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  公司门户网站制作流程,华为官网怎么做?  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  Laravel如何自定义分页视图?(Pagination示例)  实例解析angularjs的filter过滤器  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  Laravel如何自定义错误页面(404, 500)?(代码示例)  想要更高端的建设网站,这些原则一定要坚持!  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  详解Android——蓝牙技术 带你实现终端间数据传输  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  制作电商网页,电商供应链怎么做?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  如何在万网主机上快速搭建网站?  Android自定义listview布局实现上拉加载下拉刷新功能  如何快速搭建FTP站点实现文件共享?  创业网站制作流程,创业网站可靠吗?  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  米侠浏览器网页背景异常怎么办 米侠显示修复  bing浏览器学术搜索入口_bing学术文献检索地址  如何在香港免费服务器上快速搭建网站?  5种Android数据存储方式汇总  googleplay官方入口在哪里_Google Play官方商店快速入口指南  Laravel如何实现多对多模型关联?(Eloquent教程)  微信小程序 scroll-view组件实现列表页实例代码  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  如何快速搭建高效WAP手机网站?  高端企业智能建站程序:SEO优化与响应式模板定制开发  大连网站制作公司哪家好一点,大连买房网站哪个好?  什么是javascript作用域_全局和局部作用域有什么区别?  网站制作软件有哪些,制图软件有哪些?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  如何为不同团队 ID 动态生成多个非值班状态按钮  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  制作企业网站建设方案,怎样建设一个公司网站?