У меня есть массив символов, которые я хочу отсортировать:
const arr = ['z', 'a', 'Z', 'A'];
Я хочу, чтобы отсортированный порядок был следующим: заглавные буквы по алфавиту, за которыми следуют строчные буквы по алфавиту:
['A', 'Z', 'a', 'z']
Это тривиально для использования .sort()
без каких-либо параметров:
const arr = ['z', 'a', 'Z', 'A'];
arr.sort();
console.log(arr);
Но как можно использовать localeCompare
для определения одинаковой относительной позиции каждого символа?Опция caseFirst выглядела многообещающе:
В первую очередь сортировка должна выполняться в верхнем или нижнем регистре.Возможные значения: "upper", "lower" или "false" (используйте язык по умолчанию);по умолчанию это "ложь".Эта опция может быть установлена через свойство options или через ключ расширения Unicode;если указаны оба, свойство options имеет приоритет.
Но, похоже, оно не выполняет то, что я хочу.Я перепробовал много вариантов:
// Desired result: ['A', 'Z', 'a', 'z']
const arr = ['z', 'a', 'Z', 'A'];
arr.sort((a, b) => a.localeCompare(b));
console.log(arr);
arr.sort((a, b) => a.localeCompare(b, undefined, { caseFirst: 'upper' }));
console.log(arr);
arr.sort((a, b) => a.localeCompare(b, undefined, { sensitivity: 'case', caseFirst: 'upper' }));
console.log(arr);
arr.sort((a, b) => a.localeCompare(b, 'en', { caseFirst: 'upper' }));
console.log(arr);
arr.sort((a, b) => a.localeCompare(b, 'kf', { caseFirst: 'upper' }));
console.log(arr);
Я бы хотел, чтобы он работал аналогично .sort()
(по крайней мере, для буквенных символов), который сравнивает кодовую точку каждого символа:
['A', 'Z', 'a', 'z'].forEach((char) => {
console.log(char.charCodeAt());
});
Конечно, я знаю, что могу просто избежать localeCompare
и использовать .sort()
без обратного вызова, или использовать метод charCodeAt
выше:
const arr = ['z', 'a', 'Z', 'A'];
arr.sort((a, b) => a.charCodeAt() - b.charCodeAt());
console.log(arr);
Но как мне это сделать, используя localeCompare
?