巧妙排序(对可能包含或不包含数字的字符串进行排序)
Clever sorting (Sort strings that may or may not contain numbers)
我需要对可能包含或不包含数字的单位列表进行排序。
例如["unit 1", "unit 2", ..., "unit 11"].
大多数排序函数会这样排序:
单元 1、单元 11、单元 2..
不过我也可能有没有编号的情况。 ["apt A", "apt B", ..., "apt Z"].
是否有任何聪明的解决方案可以正确排序:
第 1 单元,第 2 单元,...,第 11 单元。
apt A,apt B,...,apt Z。
根据评论中的说明,您可以按 /(\d+)/g
拆分每个字符串,然后按结果字符串数组中的每个元素排序。将偶数索引视为字符串,将奇数索引视为数字:
const input = ['unit 11', 'unit 1', 'unit 2', 'apt 11', 'apt 1', 'apt 2', 'unit A', 'unit c', 'unit B', 'apt a', 'apt C', 'apt b'];
function customSort (a, b) {
a = a.toUpperCase().split(/(\d+)/g);
b = b.toUpperCase().split(/(\d+)/g);
const length = Math.min(a.length, b.length);
for (let i = 0; i < length; i++) {
const cmp = (i % 2)
? a[i] - b[i]
: -(a[i] < b[i]) || +(a[i] > b[i]);
if (cmp) return cmp;
}
return a.length - b.length;
}
console.log(input.sort(customSort));
我需要对可能包含或不包含数字的单位列表进行排序。
例如["unit 1", "unit 2", ..., "unit 11"].
大多数排序函数会这样排序: 单元 1、单元 11、单元 2..
不过我也可能有没有编号的情况。 ["apt A", "apt B", ..., "apt Z"].
是否有任何聪明的解决方案可以正确排序:
第 1 单元,第 2 单元,...,第 11 单元。
apt A,apt B,...,apt Z。
根据评论中的说明,您可以按 /(\d+)/g
拆分每个字符串,然后按结果字符串数组中的每个元素排序。将偶数索引视为字符串,将奇数索引视为数字:
const input = ['unit 11', 'unit 1', 'unit 2', 'apt 11', 'apt 1', 'apt 2', 'unit A', 'unit c', 'unit B', 'apt a', 'apt C', 'apt b'];
function customSort (a, b) {
a = a.toUpperCase().split(/(\d+)/g);
b = b.toUpperCase().split(/(\d+)/g);
const length = Math.min(a.length, b.length);
for (let i = 0; i < length; i++) {
const cmp = (i % 2)
? a[i] - b[i]
: -(a[i] < b[i]) || +(a[i] > b[i]);
if (cmp) return cmp;
}
return a.length - b.length;
}
console.log(input.sort(customSort));