Да, обработка данных как числовых действительно может изменить порядок. Учтите это:
const column = [ "1", "3", "10", "24", "212" ];
column.sort((a, b) => a.localeCompare(b));
console.log("lexicographical sort:", column);
column.sort((a, b) => a.localeCompare(b, undefined, { numeric: true }));
console.log("sort with numeric collation:", column);
Лексикографическая сортировка обрабатывает "10"
a до "2"
, поскольку "1" < "2"
вместо проверки целых чисел. Это может работать, если у вас тоже одинаковые имена:
const column = [ "file_1", "file_3", "file_10", "file_24", "file_212" ];
column.sort((a, b) => a.localeCompare(b));
console.log("lexicographical sort:", column);
column.sort((a, b) => a.localeCompare(b, undefined, { numeric: true }));
console.log("sort with numeric collation:", column);
Но может быть нежелательно в некоторых ситуациях, если вы не хотите рассматривать числа как единое целое:
const column = [ "1 Somewhere Street", "3 Some Avenue", "10 Some Avenue", "24 Parking", "212 Whatever Road" ];
column.sort((a, b) => a.localeCompare(b));
console.log("lexicographical sort:", column);
column.sort((a, b) => a.localeCompare(b, undefined, { numeric: true }));
console.log("sort with numeric collation:", column);
column.sort((a, b) => {
const regex = /^(\d+)\s+(.*)/;
const [, numericA, stringA] = a.match(regex);
const [, numericB, stringB] = b.match(regex);
return stringA.localeCompare(stringB)
|| numericA.localeCompare(numericB, undefined, { numeric: true })
});
console.log("sort with starting numerics treated last:", column);
Итак, это зависит от того, как выглядят ваши данные и как вы хотите их представить.