求助:TypeScript中自定义优先级的数组排序为何不生效?
问题分析与解决方案
看起来你的排序逻辑没生效,控制台打印前后数组完全一致,大概率是这几个原因导致的,咱们一步步排查解决:
1. 先明确Array.sort()的特性
首先要注意:Array.sort()是原地修改原数组的方法,你写的this.deliveriesProgress = this.deliveriesProgress.sort(...)其实有点多余,但这不是排序失效的核心原因。如果想保留原数组不被修改,应该先复制一份再排序:
// 复制原数组后再排序,避免修改原始数据 this.deliveriesProgress = [...this.deliveriesProgress].sort((deliveryA: DeliveryProgress, deliveryB: DeliveryProgress) => { // 排序逻辑 });
2. 核心问题:状态值与Map键不匹配,导致get返回undefined
最可能的情况是:你的delivery.$tripStatus实际值,和你Map里定义的键不完全一致——比如大小写不同(比如实际是"em andamento"全小写,你Map里写的是"Em andamento")、拼写差异(比如实际是"Concluída"带重音,你写的是"Concluida")、甚至存在额外空格。
当statusMap.get(deliveryA.$tripStatus)返回undefined时,a - b就会变成NaN,而sort函数遇到NaN的比较结果时,会直接跳过排序逻辑,最终数组看起来和原数组完全一样。
3. 排查与修复步骤
第一步:先确认状态值是否能正确匹配
在排序回调里加日志,打印每个状态和对应的优先级,看看是不是有undefined的情况:
this.deliveriesProgress.sort((deliveryA: DeliveryProgress, deliveryB: DeliveryProgress) => { const statusA = deliveryA.$tripStatus; const statusB = deliveryB.$tripStatus; const a = this.statusMap.get(statusA); const b = this.statusMap.get(statusB); // 打印日志排查匹配情况 console.log(`当前状态A: ${statusA},获取到的优先级: ${a}`); console.log(`当前状态B: ${statusB},获取到的优先级: ${b}`); // 处理undefined的情况,给默认优先级(比如999,让这类状态统一排最后) return (a ?? 999) - (b ?? 999); });
第二步:修正Map的键与实际状态值完全一致
根据日志里输出的实际状态值,调整Map的键,确保完全匹配(包括大小写、特殊字符):
// 比如实际状态是带重音的"Concluída",就改成对应的键 this.statusMap.set("Concluída", 3);
第三步:处理未定义的状态
为了避免后续新增状态导致排序失效,建议给所有不在Map里的状态设置一个默认优先级,比如上面代码里用?? 999,让这类状态统一排到最后。
这样调整后,你的排序逻辑应该就能正常工作了!
内容的提问来源于stack exchange,提问作者Rodrigo Sene
相关产品推荐
相关产品推荐

