You need to enable JavaScript to run this app. 如何对含并列标识与DQ/DNF值的JavaScript对象按placement字段排序
优惠活动
大模型
产品
解决方案
定价
更多

如何对含并列标识与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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 14:45:09