如何按指定规则对含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);
逻辑说明
- 后缀优先级映射:通过对象给每个后缀分配优先级数值,确保
homdel排在最前,LOH次之,het最后。 - 后缀优先比较:先对比两个项的后缀优先级,优先级不同直接返回排序结果。
- 前缀排序处理:后缀相同时,提取前缀的起始数字,按数字从小到大排序,保证
0→1→2→3-4→5-8→9+的顺序符合预期。
内容的提问来源于stack exchange,提问作者Tenz
相关产品推荐
相关产品推荐

