You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:10:45