我正在尝试执行自定义排序,如以下顺序:
- 特殊字符(-首先,_最后)
- 数字
- 字母
例如,如果我对以下内容进行排序
var words = ['MBC-PEP-1', 'MBC-PEP01', 'MBC-PEP91', 'MBC-PEPA1', 'MBC-PEPZ1', 'MBC-PEP_1'];
result should be
MBC-PEP-1,MBC-PEP_1,MBC-PEP01,MBC-PEP91,MBC-PEPA1,MBC-PEPZ1
使用我的代码得到的结果如下:
"MBC-PEP-1", "MBC-PEP01", "MBC-PEP91", "MBC-PEP_1", "MBC-PEPA1", "MBC-PEPZ1"
但我需要上述的排序顺序,不确定如何实现。
function MySort(alphabet)
{
return function(a, b) {
var lowerA = a.toLowerCase()
var lowerB = b.toLowerCase()
var index_a = alphabet.indexOf(lowerA[0]),
index_b = alphabet.indexOf(lowerB[0]);
if (index_a === index_b) {
// same first character, sort regular
if (a < b) {
return -1;
} else if (a > b) {
return 1;
}
return 0;
} else {
return index_a - index_b;
}
}
}
var items = ['MBC-PEP-1', 'MBC-PEP01', 'MBC-PEP91', 'MBC-PEPA1', 'MBC-PEPZ1', 'MBC-PEP_1'],
sorter = MySort('-_0123456789abcdefghijklmnopqrstuvwxyz');
console.log(items.sort(sorter));
.
并且需要按照不同的顺序指定,那么会发生什么呢?维护起来很困难,因为你无法真正定义所需的顺序。 - CᴏʀʏlocaleCompare()
的内部复杂性而不是你的方法。我建议使用return -(a < b) || +(a > b);
,我在这个答案中解释了原因,正如基准测试所示,它超越了所有这些答案。 - Patrick Roberts