Как заставить localeCompare вести себя аналогично .sort (), чтобы все заглавные буквы были на первом месте? - PullRequest
0 голосов
/ 04 марта 2019

У меня есть массив символов, которые я хочу отсортировать:

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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...