如何修改字母/数值比较函数为日期比较函数实现Mat List时序排序
解决方案:适配日期字符串的排序函数
刚好能解决你的需求!这里给你一套适配的方案,让OrderDate字段可以按照时间顺序正确排序,同时兼容你现有的isAsc参数逻辑:
1. 编写日期专用比较函数
这个函数会把日期字符串转为可比较的时间戳,同时支持升降序控制:
function dateCompare(aDateStr, bDateStr, isAsc) { // 将日期字符串转为Date对象后,获取毫秒级时间戳 const timestampA = new Date(aDateStr).getTime(); const timestampB = new Date(bDateStr).getTime(); // 和你现有compare函数的逻辑保持一致,确保排序行为统一 return (timestampA < timestampB ? -1 : 1) * (isAsc ? 1 : -1); }
2. 更新原有排序逻辑
只需要在switch语句的OrderDate分支,替换成这个日期专用函数即可:
this.sortedData = data.sort((a, b) => { const isAsc = sort.direction === 'asc'; switch (sort.active) { case 'OrderId': return compare(+a.OrderId, +b.OrderId, isAsc); case 'Site': return compare(a.Site, b.Site, isAsc); case 'OrderDate': // 替换为日期专用比较函数 return dateCompare(a.OrderDate, b.OrderDate, isAsc); case 'Email': return compare(a.Email, b.Email, isAsc); case 'Phone': return compare(a.Phone, b.Phone, isAsc); case 'FullName': return compare(a.FullName, b.FullName, isAsc); default: return 0; } });
3. 可选:处理无效日期场景
如果你的数据中存在无法被new Date()解析的无效日期字符串,可以给函数加个容错处理,比如把无效日期统一排到末尾:
function dateCompare(aDateStr, bDateStr, isAsc) { const dateA = new Date(aDateStr); const dateB = new Date(bDateStr); // 处理无效日期:如果a是无效日期,升序时排到最后,降序时排到最前 if (isNaN(dateA.getTime())) return isAsc ? 1 : -1; // 如果b是无效日期,升序时排到最后,降序时排到最前 if (isNaN(dateB.getTime())) return isAsc ? -1 : 1; const timestampA = dateA.getTime(); const timestampB = dateB.getTime(); return (timestampA < timestampB ? -1 : 1) * (isAsc ? 1 : -1); }
内容的提问来源于stack exchange,提问作者Jonas Praem
相关产品推荐
相关产品推荐

