如何对含并列标识与DQ/DNF值的JavaScript对象按placement字段排序
兼容特殊标记的
placement 字段排序实现 原实现失效原因
- 当
placement取值为DQ/DNF时,parseInt()会返回NaN,基于NaN的差值比较无法产生稳定排序效果,特殊值无法被自动沉到列表末尾 - 原生JavaScript普通对象没有内置
sort方法,直接调用this.placements.sort()会触发运行时报错
实现逻辑
- 给
DQ/DNF这类特殊值设置一个远大于所有常规名次的固定权重,从规则上保证这类条目永远排在常规名次之后 - 对常规名次值,沿用原有
parseInt提取数字部分的逻辑,兼容1、3T、5T这类带并列后缀的格式 - 先将对象结构的
placements转换为可排序的键值对数组,完成排序后再根据需要转回原对象结构
可直接复用的代码实现
// 特殊值权重,设置为远大于可能出现的最大常规名次,确保沉底 const SPECIAL_PLACEMENT_BASE_WEIGHT = 99999; sortByFinish(): void { // 转为键值对数组 [条目ID, 条目数据] const placementList = Object.entries(this.placements); const sortedList = placementList.sort(([_, dataA], [_, dataB]) => { // 提取单个条目的排序权重 const getSortWeight = (placementValue: string) => { if (placementValue === 'DQ' || placementValue === 'DNF') { return SPECIAL_PLACEMENT_BASE_WEIGHT; } return parseInt(placementValue); }; const weightA = getSortWeight(dataA.placement); const weightB = getSortWeight(dataB.placement); return weightA - weightB; }); // 转回原对象结构,匹配原有数据格式 this.placements = Object.fromEntries(sortedList); }
排序效果说明
使用提供的样例数据执行排序后,最终顺序为:
- 名次1:Bates(placement为
1) - 名次2-3:Puget Sound、Lehigh(均为
3T) - 名次4-7:Williams、Wesleyan、Rensselaer Polytech、Mount Holyoke(均为
5T) - 列表末尾:St Olaf(placement为
DNF)
如果需要对同权重的并列条目补充次级排序规则(比如按精神得分、种子号排序),可以在权重相等时追加比较逻辑,例如:
// 权重相同时,按精神得分从高到低排序 if (weightA === weightB) { return parseFloat(dataB.spirit_score) - parseFloat(dataA.spirit_score); }
内容的提问来源于stack exchange,提问作者bmorgs
相关产品推荐
相关产品推荐

