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

如何按指定规则对含LOH、het的JavaScript数组进行自定义排序?

问题:JavaScript数组自定义排序不符合预期

原数组

const array = [
  {name: '0:homdel', data: Array(3)},
  {name: '1:LOH', data: Array(5)}, 
  {name: '2:het', data: Array(5)},
  {name: '2:LOH', data: Array(5)},
  {name: '3-4:het', data: Array(5)},
  {name: '3-4:LOH', data: Array(5)},
  {name: '5-8:het', data: Array(5)},
  {name: '5-8:LOH', data: Array(5)},
  {name: '9+:het', data: Array(5)},
  {name: '9+:LOH', data: Array(5)}
];

期望排序结果

const sortedArray = [
  {name: '0:homdel', data: Array(3)},
  {name: '1:LOH', data: Array(5)},
  {name: '2:LOH', data: Array(5)},
  {name: '3-4:LOH', data: Array(5)},
  {name: '5-8:LOH', data: Array(5)},
  {name: '9+:LOH', data: Array(5)},
  {name: '2:het', data: Array(5)},
  {name: '3-4:het', data: Array(5)},
  {name: '5-8:het', data: Array(5)},
  {name: '9+:het', data: Array(5)}
];

原自定义排序函数(不符合预期)

function customSort(a, b) {
  let [countA, nameA] = a.name.split(':');
  let [countB, nameB] = b.name.split(':');
  let nameComparison = nameA.localeCompare(nameB);
  let countComparison = parseInt(countA) - parseInt(countB);
  if (nameComparison == 0) {
    return countComparison;
  } else {
    return nameComparison;
  }
}

问题分析

原函数存在两个核心问题:

  • 后缀排序优先级错误:localeCompare按字母顺序排序时,het会排在LOH前面,和预期相反;同时未单独处理homdel的最高优先级。
  • 前缀区间处理逻辑不严谨:parseInt('3-4')仅提取到3、parseInt('9+')提取到9,虽能勉强排序,但逻辑不够通用,且原函数先比较后缀再比较前缀的顺序,和预期的“先按后缀分组,再按前缀排序”逻辑不符。

正确的自定义排序函数

function customSort(a, b) {
  // 定义后缀优先级:homdel > LOH > het,数值越小优先级越高
  const suffixPriority = {
    'homdel': 0,
    'LOH': 1,
    'het': 2
  };

  // 拆分前缀与后缀
  const [prefixA, suffixA] = a.name.split(':');
  const [prefixB, suffixB] = b.name.split(':');

  // 先比较后缀优先级
  const suffixDiff = suffixPriority[suffixA] - suffixPriority[suffixB];
  if (suffixDiff !== 0) {
    return suffixDiff;
  }

  // 提取前缀的起始数字,处理3-4、9+这类区间格式
  const getStartNum = (prefix) => {
    const numMatch = prefix.match(/^\d+/);
    return numMatch ? parseInt(numMatch[0]) : Infinity;
  };

  // 后缀相同时,按前缀起始数字排序
  return getStartNum(prefixA) - getStartNum(prefixB);
}

// 使用示例
const sortedArray = [...array].sort(customSort);

逻辑说明

  1. 后缀优先级映射:通过对象给每个后缀分配优先级数值,确保homdel排在最前,LOH次之,het最后。
  2. 后缀优先比较:先对比两个项的后缀优先级,优先级不同直接返回排序结果。
  3. 前缀排序处理:后缀相同时,提取前缀的起始数字,按数字从小到大排序,保证0→1→2→3-4→5-8→9+的顺序符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:46:05