JavaScript数组自定义字符串排序:调整LN、UN、PG的排列顺序
自定义数组排序:调整特殊元素的顺序
原问题场景
给定数组:
const arr = [{name:'11'},{name:'10'},{name:'9'},{name:'8'},{name:'7'}, {name:'6'},{name:'5'},{name:'4'},{name:'3'},{name:'2'},{name:'1'}, {name:'UN'},{name:'PG'},{name:'LN'}, {name:'12'},{name:'13'}]
使用以下排序代码后,输出为 [LN,PG,UN,1,2,3,4,5,6,7,8,9,10,11,12,13]:
arr.sort((x, y)=> { if(x.name == 'LN' || x.name=='UN' || x.name== 'PG' || (parseInt(x.name)<parseInt(y.name))) { return -1; } return 0; })
需求是让PG排在UN之后,预期输出为 [LN,UN,PG,1,2,3,4,5,6,7,8,9,10,11,12,13],询问能否直接在sort函数内实现,还是必须排序后执行交换操作。
解决方案:直接在sort函数内实现
不需要额外交换,只要明确特殊元素的优先级规则,就能在sort回调里完成预期排序。
核心思路是给特殊元素定义明确的优先级权重,让排序逻辑能区分它们的顺序:
- 特殊元素优先级:LN > UN > PG
- 所有特殊元素排在数字元素前面
- 数字元素按数值升序排列
实现代码如下:
const priority = { 'LN': 0, 'UN': 1, 'PG': 2 }; arr.sort((x, y) => { const xIsSpecial = priority.hasOwnProperty(x.name); const yIsSpecial = priority.hasOwnProperty(y.name); // 两个都是特殊元素,按优先级排序 if (xIsSpecial && yIsSpecial) { return priority[x.name] - priority[y.name]; } // x是特殊元素,y不是,x排前面 if (xIsSpecial) { return -1; } // y是特殊元素,x不是,y排前面 if (yIsSpecial) { return 1; } // 都是数字元素,按数值升序排列 return parseInt(x.name) - parseInt(y.name); });
执行后数组的简化输出就是 [LN,UN,PG,1,2,3,4,5,6,7,8,9,10,11,12,13],完全符合预期。
原排序逻辑的问题
原代码的逻辑是只要x是LN/UN/PG,或者x的数字小于y就返回-1,但没有定义这三个特殊元素之间的比较规则。由于JavaScript的sort是不稳定排序(不同JS引擎的实现可能有差异),这三个元素的相对顺序无法保证,所以才会出现PG排在UN前面的情况。
内容的提问来源于stack exchange,提问作者SKR123
相关产品推荐
相关产品推荐

