JavaScript按Status、ETA多字段排序不生效问题求解
问题原因
你现有排序代码无法正常工作,核心是3个问题:
- 运算符优先级错误:
&&运算优先级高于三元表达式,你写的a.eta > b.eta ? 1 : -1 && statusOrdered.indexOf(a.status) - statusOrdered.indexOf(b.status)会先计算-1 && 状态排序差值,这部分永远返回-1,Status排序逻辑根本不会被执行 - 排序优先级顺序写反:双字段排序需要先按主维度(Status)排序,只有当两条数据的Status优先级完全相等时,才触发次维度(ETA)的二次排序,你把ETA判断写在最前面,逻辑顺序完全颠倒
- 边界场景未覆盖:样例数据中id为2、4的条目没有
eta字段,直接比较会拿到undefined,排序结果不可控
修正后代码
首先确保你已经提前定义好Status的优先级顺序数组(你原有逻辑里已经有这个变量,示例优先级可根据业务调整):
const statusOrdered = ["active", "upcoming", "pending"];
排序及渲染部分修正如下:
<tbody> {/* 浅拷贝避免sort修改原数组产生副作用 */} {[...searchResults].sort((a, b) => { // 先按Status主维度排序 const statusRankDiff = statusOrdered.indexOf(a.status) - statusOrdered.indexOf(b.status); if (statusRankDiff !== 0) return statusRankDiff; // Status相同时按ETA升序排序,无ETA的条目统一排到最后 const etaA = a.eta ?? Infinity; const etaB = b.eta ?? Infinity; return etaA - etaB; }).map(el => { return ( <tr key={el.id}> <td>{el.id}</td> <td>{el.name}</td> <td>{el.amount}</td> <td>{el.eta ?? '-'}</td> <td>{el.status}</td> </tr> ); })} </tbody>
补充说明:如果需要ETA降序,把
return etaA - etaB改成return etaB - etaA即可;如果要把无ETA的条目排到最前面,把兜底值Infinity换成-Infinity。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

