JavaScript中实现带括号开头字符串排末尾的升序排序
如何将带括号开头的字符串排在列表末尾并整体升序排序?
现有字符串列表:
const items = ['ABC - Desk 1 ', 'NDF - Desk 2 ' , '(Busy) DEF - desk 3 ', '(Busy) Test desk ']
需求是:升序排列时,无括号开头的字符串排在前面,带括号开头的排在末尾,且所有元素整体保持升序;降序则反过来。
原来直接用localeCompare的排序方式不符合预期——因为(的Unicode编码比英文字母小,会导致带括号的元素排在前面。可以通过修改排序比较函数来实现需求:
实现代码
const orderAsc = true; // 切换为false可测试降序逻辑 items.sort((item1, item2) => { const item1HasBracket = item1.startsWith('('); const item2HasBracket = item2.startsWith('('); if (orderAsc) { // 升序规则:无括号组在前,带括号组在后,组内升序 if (!item1HasBracket && !item2HasBracket) { return item1.localeCompare(item2); } else if (item1HasBracket && !item2HasBracket) { return 1; // 带括号的item1排到后面 } else if (!item1HasBracket && item2HasBracket) { return -1; // 无括号的item1排到前面 } else { // 同属带括号组,按字符串升序 return item1.localeCompare(item2); } } else { // 降序规则:带括号组在前,无括号组在后,组内降序 if (item1HasBracket && item2HasBracket) { return item2.localeCompare(item1); } else if (item1HasBracket && !item2HasBracket) { return -1; // 带括号的item1排到前面 } else if (!item1HasBracket && item2HasBracket) { return 1; // 无括号的item1排到后面 } else { // 同属无括号组,按字符串降序 return item2.localeCompare(item1); } } }); console.log(items);
测试结果
- 升序时输出:
['ABC - Desk 1 ', 'NDF - Desk 2 ', '(Busy) DEF - desk 3 ', '(Busy) Test desk '] - 降序时输出:
['(Busy) Test desk ', '(Busy) DEF - desk 3 ', 'NDF - Desk 2 ', 'ABC - Desk 1 ']
原理说明
通过startsWith('(')先给元素分组,优先处理组之间的排序优先级,再在同一组内用localeCompare做字符串排序,既满足了“带括号元素后置/前置”的分组要求,又保证了组内的升降序规则。
内容的提问来源于stack exchange,提问作者Bkfsec
相关产品推荐
相关产品推荐

