当前位置: 首页 > news >正文

手动 对列表字段进行排序

目录

 1. 严格按照排序:数字<字母<中文<特殊<空值 

2.  按字符编码顺序:0(U+0030)< 《(U+300A)< A(U+0041)< 成(U+6210)。


//数据
const tableData = [{ id: 1, itemName: 'AA成品111', itemSpec: 'AA成品111' },{ id: 2, itemName: '行李螺丝', itemSpec: '--' },{ id: 3, itemName: '10', itemSpec: 'null' },{ id: 4, itemName: '啊-01', itemSpec: '螺丝' },{ id: 5, itemName: '--', itemSpec: 'AA009*002' },{ id: 6, itemName: '1', itemSpec: '' },{ id: 7, itemName: null, itemSpec: '' },{ id: 8, itemName: '《配件》3612', itemSpec: '【ww胜11多我问问负少】' },{ id: 9, itemName: '0217-23', itemSpec: '螺丝' }
];
 1. 严格按照排序:数字<字母<中文<特殊<空值 

/*支持正序/倒序的排序函数
* field---字段,例如'itemName'
* order-- 正序/倒序
*/
sortTableData(field, order) {
const tempData=[...this.list]tempData.sort((a, b) => {const valA = a[field] ?? ''; //处理const valB = b[field] ?? '';// 处理空字符串(排在末尾)if (valA === '' && valB === '') return 0;if (valA === '') return order === 'asc' ? 1 : -1;if (valB === '') return order === 'asc' ? -1 : 1;// 数字识别(正则匹配纯数字)const isNumA = /^\d+$/.test(valA);const isNumB = /^\d+$/.test(valB);// 数字识别(只要数字开头 就 视为数字)//const isNumA = /^\d/.test(valA);//const isNumB = /^\d/.test(valB);if (isNumA && isNumB) {return order === 'asc' ? parseInt(valA) - parseInt(valB) : parseInt(valB) - parseInt(valA);}if (isNumA) return order === 'asc' ? -1 : 1;if (isNumB) return order === 'asc' ? 1 : -1;// 字母识别(正则匹配字母开头)const isLetterA = /^[A-Za-z]/.test(valA);const isLetterB = /^[A-Za-z]/.test(valB);if (isLetterA && isLetterB) {return order === 'asc' ? valA.localeCompare(valB) : valB.localeCompare(valA);}if (isLetterA) return order === 'asc' ? -1 : 1;if (isLetterB) return order === 'asc' ? 1 : -1;// 区分特殊字符和中文const isSpecialA = /^[^a-zA-Z0-9\u4e00-\u9fa5]/.test(valA);const isSpecialB = /^[^a-zA-Z0-9\u4e00-\u9fa5]/.test(valB);if (isSpecialA && !isSpecialB) return order === 'asc' ? 1 : -1;if (!isSpecialA && isSpecialB) return order === 'asc' ? -1 : 1;// 中文按拼音,特殊字符最后return order === 'asc' ? valA.localeCompare(valB, 'zh-CN') : valB.localeCompare(valA, 'zh-CN');});this.list=tempData
return  tempData
}

打印结果为:1 → 10 → 0217-23 → AA成品111 → 啊-01 → 行李螺丝 → 《配件》3612 → -- → null

2.  按字符编码顺序:0(U+0030)< (U+300A)< A(U+0041)< (U+6210)。
/*
* 排序
* field ---字段
* order ---正序/倒序
*/
sortByField(field, order) {const tempData = [...this.tableData];tempData.sort((a, b) => {const valA = a[field];const valB = b[field];// 处理空值或无效值(统一放末尾)if (valA === null || valA === undefined || valA === '' || valA === '--') {return 1;}if (valB === null || valB === undefined || valB === '' || valA === '--') {return -1;}// 判断类型const isNumA = !isNaN(parseFloat(valA)) && isFinite(valA);const isNumB = !isNaN(parseFloat(valB)) && isFinite(valB);// 数字比较if (isNumA && isNumB) {return order === 'asc' ? parseFloat(valA) - parseFloat(valB) : parseFloat(valB) - parseFloat(valA);}// 数字优先于非数字if (isNumA && !isNumB) {return order === 'asc' ? -1 : 1;}if (!isNumA && isNumB) {return order === 'asc' ? 1 : -1;}// 非数字按 Unicode 排序(字母和中文)return order === 'asc' ? valA.toString().localeCompare(valB.toString()) : valB.toString().localeCompare(valA.toString());});this.tableData = tempData;return  tempData
}

 

http://www.dtcms.com/a/307057.html

相关文章:

  • 【高等数学】第七章 微分方程——第四节 一阶线性微分方程
  • LNN+XGBoost:优化多层供应链订购:缓解牛鞭效应
  • C++STL系列之bitset
  • Git——分布式版本控制系统
  • #C语言——学习攻略:深挖指针路线(四)--字符指针变量,数组指针变量,二维数组传参的本质,函数指针变量,函数指针数组
  • ConvertX:自托管的在线文件转换器,支持1000+种格式!
  • Linux系统编程Day1-- 免费云服务器获取以及登录操作
  • CH347使用笔记:CH347作为FPGA下载器的几种方式
  • Maven 配置阿里云镜像加速
  • huggingface是什么?2025-07-30
  • Mac 上配置jdk 环境变量
  • 2. Agent与 React流程
  • 【LY88】双系统指南及避坑
  • Python 的 match-case
  • 从映射到共生:元宇宙、物联网与AI的智能融合生态图谱
  • (LeetCode 面试经典 150 题) 141. 环形链表(快慢指针)
  • HPCtoolkit的下载使用
  • Oracle11g数据库迁移达梦8数据库方案
  • Python序列化和反序列化
  • 如何用Docker部署ROS2
  • (C++)C++类和类的方法(基础教程)(与Python类的区别)
  • c++之基础B之sort排序(第三个参数没有)(第二课)
  • Fiddler中文教程 从入门到进阶的网络抓包与接口调试实战指南
  • Python Pandas.merge_asof函数解析与实战教程
  • VUE前端
  • [Agent开发平台] API网关 | 业务领域 | DTO格式 | 分页令牌
  • React 服务端渲染(SSR)详解
  • 使用 cron 配合 Docker 实现定时任务
  • 神经网络的并行计算与加速技术
  • 模型相关类代码回顾理解 | BatchNorm2d\fc.in_features\nn.Linear\torchsummary