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

按结束时间及指定状态序列排序对象数组的方案咨询

双字段排序方案分析与修正

现有方案的问题分析

你的代码思路方向是对的,但存在两处关键问题:

  1. 空endTime的处理逻辑可能不符合预期
    你把空endTime映射为Infinity,在倒序排序中,Infinity会比任何有效时间戳都大,所以空endTime的项会排在最前面。如果你的实际需求是空endTime应该排在所有有有效时间的项之后,那这里应该用-Infinity而非Infinity。

  2. this指向的潜在bug
    如果这段排序代码不是在类的方法中执行(比如在普通函数或全局作用域里),this.sortDSCOrder会指向全局对象(浏览器环境下是window),而如果sortDSCOrder是局部变量,这里会得到undefined,导致indexOf返回-1,状态排序逻辑完全失效。应该直接使用变量名sortDSCOrder。

修正后的代码

场景1:空endTime排在最前面(保留原逻辑)

data.sort((a, b) => {
  const timeA = a.endTime ? new Date(a.endTime).getTime() : Infinity;
  const timeB = b.endTime ? new Date(b.endTime).getTime() : Infinity;
  
  // 优先按endTime倒序
  const timeDiff = timeB - timeA;
  if (timeDiff !== 0) {
    return timeDiff;
  }
  
  // endTime相同时,按sortDSCOrder指定顺序排序
  const indexA = sortDSCOrder.indexOf(a.status);
  const indexB = sortDSCOrder.indexOf(b.status);
  return indexA - indexB;
});

场景2:空endTime排在最后(更常见业务需求)

data.sort((a, b) => {
  const timeA = a.endTime ? new Date(a.endTime).getTime() : -Infinity;
  const timeB = b.endTime ? new Date(b.endTime).getTime() : -Infinity;
  
  // 优先按endTime倒序
  const timeDiff = timeB - timeA;
  if (timeDiff !== 0) {
    return timeDiff;
  }
  
  // endTime相同时,按sortDSCOrder指定顺序排序
  const indexA = sortDSCOrder.indexOf(a.status);
  const indexB = sortDSCOrder.indexOf(b.status);
  return indexA - indexB;
});

代码说明

  • 把时间戳计算抽成变量,提升代码可读性,避免重复调用new Date()和getTime()。
  • 明确判断时间差是否为0,避免逻辑短路带来的意外问题(比如时间差为0时才执行状态排序逻辑)。
  • 修复this指向问题,直接使用局部变量sortDSCOrder,确保状态排序逻辑稳定运行。

修正后的输出(场景2示例)

[
  { "status": "Accepted", "endTime": "Sep 16 2022, 04:19 GMT+5" },
  { "status": "In Progress", "endTime": "Sep 16 2022, 04:18 GMT+5" },
  { "status": "New", "endTime": "Sep 16 2022, 04:18 GMT+5" },
  { "status": "Kick Off Policy Review Task", "endTime": "Sep 16 2022, 04:13 GMT+5" },
  { "status": "Accepted", "endTime": "" }
]

内容的提问来源于stack exchange,提问作者Sunil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:30:41