我正在尝试执行以下订单这样的自定义排序
例如,如果我在下面进行排序
var words = ['MBC-PEP-1', 'MBC-PEP01', 'MBC-PEP91', 'MBC-PEPA1', 'MBC-PEPZ1', 'MBC-PEP_1'];
结果应为
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));
答案 0 :(得分:1)
我将答案从here移植到了JavaScript,JavaScript可以完成您想要的操作而无需使用递归或任何过于复杂的操作:
function MySort(alphabet) {
return function (a, b) {
a = a.toLowerCase();
b = b.toLowerCase();
var pos1 = 0;
var pos2 = 0;
for (var i = 0; i < Math.min(a.length, b.length) && pos1 == pos2; i++) {
pos1 = alphabet.indexOf(a[i]);
pos2 = alphabet.indexOf(b[i]);
}
if (pos1 == pos2 && a.length != b.length) {
return o1.length - o2.length;
}
return pos1 - pos2;
};
}
var items = ['MBC-PEP-1', 'MBC-PEP01', 'MBC-PEP91', 'MBC-PEPA1', 'MBC-PEPZ1', 'MBC-PEP_1'],
sorter = MySort('-_0123456789abcdefghijklmnopqrstuvwxyz');
console.log(items.sort(sorter));
答案 1 :(得分:1)
正如Narigo在回答中所说,您只是比较第一个字符。这是一个可能更简单的想法:
function MySort(a, b) {
a = a.replace("_", ".");
b = b.replace("_", ".");
return a.localeCompare(b);
}
var items = ['MBC-PEP-1', 'MBC-PEP01', 'MBC-PEP91', 'MBC-PEPA1', 'MBC-PEPZ1', 'MBC-PEP_1'];
console.log(items.sort(MySort));
我们基本上使用普通的字符串比较,只是我们将下划线更改为点来确定顺序,因为它与您要实现的功能兼容。
答案 2 :(得分:-1)
您只查看算法中的第一个字符。您还需要检查更多的字符串/下一个字符。这是使用递归的快速解决方案:
function MySort(alphabet)
{
return function recSorter(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 && index_a >= 0) {
return recSorter(a.slice(1), b.slice(1));
} 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));
我不确定当您使用不同长度的字符串,字母以外的字符或其他大写字母时会发生什么。对于发布的示例,这将导致预期的顺序。