如何在PrimeNG的p-table中实现带后缀数字字符串的自定义排序
解决PrimeNG p-table带后缀数字字符串的排序异常问题
问题根源是当前字符串排序用了默认的localeCompare,它按字典序处理内容,导致SUN - 11排在SUN - 2前面——因为字典序中"1"的优先级高于"2"。要实现按短横线后的数字排序,需要修改自定义排序逻辑,提取字符串中的数字部分进行数值比较。
修改后的customSort函数如下:
customSort(event: SortEvent) { event.data.sort((data1, data2) => { let value1 = data1[event.field]; let value2 = data2[event.field]; let result = null; if (value1 == null && value2 != null) result = -1; else if (value1 != null && value2 == null) result = 1; else if (value1 == null && value2 == null) result = 0; else if (typeof value1 === 'string' && typeof value2 === 'string') { // 提取短横线后的数字部分 const numMatch1 = value1.match(/-\s*(\d+)$/); const numMatch2 = value2.match(/-\s*(\d+)$/); if (numMatch1 && numMatch2) { // 转成数值比较 const num1 = parseInt(numMatch1[1], 10); const num2 = parseInt(numMatch2[1], 10); result = num1 - num2; } else { // 不符合格式的字符串仍用localeCompare排序 result = value1.localeCompare(value2); } } else { result = (value1 < value2) ? -1 : (value1 > value2) ? 1 : 0; } return (event.order * result); }); }
代码说明:
- 用正则表达式
/-\s*(\d+)$/匹配字符串末尾的数字(匹配短横线、可选空格,然后是一串连续数字) - 如果两个字符串都符合该格式,提取数字转成整数后做数值减法比较,保证
SUN - 2排在SUN - 11前面 - 对于不符合该格式的字符串,保留原有的
localeCompare逻辑,不影响其他字符串列的排序
内容的提问来源于stack exchange,提问作者Diana
相关产品推荐
相关产品推荐

