layui.sort怎么对复杂的JSON数组对象进行多条件排序

大杰君_9297

大杰君_9297

2026-10-18

936人浏览

原创

layui.sort仅支持单字段排序,不适用于多条件排序;应使用原生array.prototype.sort配合自定义比较函数实现多字段、类型安全、空值可控的稳定排序。

layui.sort怎么对复杂的json数组对象进行多条件排序

layui.sort 不适合多条件排序,别硬套用

layui.sort 是个单字段字符串/数字比对工具,内部直接调用 Array.prototype.sort 但只传一个比较逻辑,不支持链式判断。你传多个字段名(比如 ['name', 'age'])它会报错或静默失败;传对象数组时,若字段类型混杂(如 name 是字符串、score 是数字),它统一转成字符串比,"10" 一定排在 "2" 前面——这不是 bug,是设计使然。

真正需要多条件排序时,应该绕过 layui.sort,改用原生 Array.prototype.sort 配合自定义比较函数。

用原生 sort 实现稳定多字段排序(含空值和类型安全)

核心是写一个返回 -1/0/1 的比较函数,并用 || 短路连接多个字段判断。下面这个写法能覆盖大多数场景:

dmap-jsapi-skill
dmap-jsapi-skill

DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。

下载
data.sort((a, b) => {
  // 第一优先级:status 升序(null 排最后)
  const statusA = a.status == null ? Infinity : a.status;
  const statusB = b.status == null ? Infinity : b.status;
  if (statusA !== statusB) return statusA // 第二优先级:score 降序(null 排最后)
const scoreA = a.score == null ? -Infinity : a.score;
const scoreB = b.score == null ? -Infinity : b.score;
if (scoreA !== scoreB) return scoreB - scoreA;<p>// 第三优先级:name 字符串升序(忽略大小写 + 中文兼容)
const nameA = String(a.name || '').trim();
const nameB = String(b.name || '').trim();
return nameA.localeCompare(nameB, 'zh-CN');
});
</p>
  • 每项比较都显式处理 null/undefined,避免 localeCompare 报错或 NaN 干扰
  • 数字字段用减法,字符串字段用 localeCompare,不混用类型转换
  • 降序就交换 a 和 b 位置,比如 scoreB - scoreA
  • 别在 done 回调里直接 data.sort() —— table.reload() 传的是浅拷贝,得传新引用

在 table.reload 中正确应用预排序结果

Layui 表格不会自动识别你已经排好序的 data,必须确保 reload 时传入的是**已排序完成的新数组引用**,且禁用前端自动排序:

  • 配置中设 autoSort: false,否则点击表头还会触发默认字符串排序
  • 不要只传 { data: sortedData },要传完整配置对象:table.reload('id', { data: sortedData, autoSort: false })
  • 如果用了分页,且想全局排序(非仅当前页),必须配合后端——前端预排序只适用于全量数据一次性加载场景
  • 服务端分页下,前端预排序无效;此时应监听 sort 事件,拼 where.sort 发请求,由后端执行 ORDER BY

中文字段排序失效?不是 layui 的问题,是 locale 没传对

localeCompare 默认按英文规则排,"张三" 会排在 "李四" 后面。必须显式指定语言环境:

  • 用 a.name.localeCompare(b.name, 'zh-CN'),不是 'zh' 或空字符串
  • 浏览器兼容性要注意:IE 不支持第二个参数,可加降级逻辑:typeof a.name?.localeCompare === 'function' ? a.name.localeCompare(b.name, 'zh-CN') : a.name > b.name ? 1 : -1
  • 别依赖 layui.sort(data, 'name', 'asc', true) 的第四个参数——它只是开关,不传 'zh-CN',实际还是走默认 locale
  • 字段含 HTML 标签或富文本?先用 DOMPurify.sanitize() 或正则提取纯文本再比,否则 <span>张</span> 会乱序

多字段排序真正的复杂点不在写法,而在于状态同步:前端维护的排序逻辑,和服务端是否一致、翻页时是否重置、搜索条件下是否保留优先级——这些地方一漏,用户点几下就发现顺序“跳变”。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2523

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5423

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6450

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

6078

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

863

5

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2115

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3222

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1076

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3659

7

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
ThinkPHP配置开发与CMS后台实战
ThinkPHP配置开发与CMS后台实战

共87课时 | 12.9万人学习

第二十三期_综合实战
第二十三期_综合实战

共89课时 | 11.1万人学习

Layui 快速入门精讲
Layui 快速入门精讲

共5课时 | 1.6万人学习