Это довольно сложный вид.Вы просите, чтобы числа сортировались низко и в порядке возрастания;это просто.Все остальное требует неестественной сортировки по возрастанию с несловесными символами в конце и символами слова, отсортированными с заглавной буквы, что является противоположным результатом localeCompare
.
Вот решение "грубой силы", которое перечисляет каждую возможностьи обрабатывает их соответствующим образом:
var arr = ["1", "4", "abc", "Abc", "20", "33", "ABC", "abc", "def", "nike", "za", "(", "]","1","-123", "6", "10", "20", "33", "4", "6", "10", "20", "33", "ABC", "abcd", "DEf", "nike", "za", "(", "]", "abc", "def", "nike", "za", "(", "([", "]","1", "4", "6", "10", "20", "33", "ABC", "abc", "def", "nike", "za", "](", "[]]","1", "4", "6", "10", "20", "10","%","$", "ABC", "33", "XYZ", "abc", "def", "nike", "za", "(", "]", "a"];
arr.sort((a, b) => {
if (a.match(/^-?\d+$/)) {
return b.match(/^-?\d+$/) ? (+a) - (+b) : -1;
}
else if (a.match(/^\w+$/)) {
if (b.match(/^-?\d+$/)) {
return 1;
}
else if (b.match(/^\w+$/)) {
if (a.match(/^[A-Z]/)) {
if (b.match(/^[A-Z]/)) {
const aLen = a.match(/^[A-Z]+/)[0].length;
const bLen = b.match(/^[A-Z]+/)[0].length;
if (aLen !== bLen) {
return bLen - aLen;
}
return a.localeCompare(b);
}
return -1;
}
return b.match(/^[A-Z]/) ? 1 : a.localeCompare(b);
}
return -1;
}
else if (b.match(/^-?\d+$/) || b.match(/^\w+$/)) {
return 1;
}
return a.localeCompare(b);
});
console.log(arr);