按结束时间及指定状态序列排序对象数组的方案咨询
双字段排序方案分析与修正
现有方案的问题分析
你的代码思路方向是对的,但存在两处关键问题:
空endTime的处理逻辑可能不符合预期
你把空endTime映射为Infinity,在倒序排序中,Infinity会比任何有效时间戳都大,所以空endTime的项会排在最前面。如果你的实际需求是空endTime应该排在所有有有效时间的项之后,那这里应该用-Infinity而非Infinity。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
相关产品推荐
相关产品推荐

