Сортировать JavaScript массив строк с годами внутри - PullRequest
0 голосов
/ 30 апреля 2020

Оценивает 2 чрезвычайно простых массива, один сортирует нормально, а другой нет:

var qtr = ['zzqtr_1_2020','zzqtr_2_2020','zzqtr_3_2019','zzqtr_4_2019'];
qtr.sort();
// qtr is now zzqtr_1_2020, zzqtr_2_2020, zzqtr_3_2019, zzqtr_4_2019 (no change)

var fruits = ["a_1_Banana", "a_2_Orange", "a_1_Apple", "a_1_Mango"];  
fruits.sort();
// fruits is now  a_1_Apple, a_1_Banana, a_1_Mango, a_2_Orange (SORTED!)

Что я не могу понять, так это то, почему массив qtr не будет отсортирован должным образом?

Ответы [ 4 ]

2 голосов
/ 30 апреля 2020

Поскольку массив уже отсортирован. Ваша разница сделана по идентификатору после "zzqtr_". И элементы уже отсортированы.

0 голосов
/ 30 апреля 2020

Array.prototype.sort() работает путем сравнения кодовых точек UTF-16, которые иногда могут привести к неожиданным результатам.

Вместо этого рассмотрите возможность использования функции String.prototype.localeCompare(), которая сравнивает две строки на основе алфавитов локали а не кодовые точки UTF-16

0 голосов
/ 30 апреля 2020

Массив уже отсортирован. Строка после "zzqtr_" находится в возрастающем порядке (ie: от 1 до 4). Итак, если вы сделали что-то вроде этого:

var qtr = ['zzqtr_3_2020','zzqtr_1_2020','zzqtr_4_2019','zzqtr_1_2019'];
qtr.sort();
var x = qtr.toString();

сейчас, вы увидите изменение:)

0 голосов
/ 30 апреля 2020

Array.prototype.sort() сравнивает последовательности UTF-16, поэтому zzqtr_1, zzqtr_2, zzqtr_3, zzqtr_4 уже отсортировано в соответствии с тем, что последний бит текста (год) здесь не имеет значения.

Я предполагаю, что вы хотите отсортировать по году, поэтому в этом случае вам нужно реализовать пользовательскую функцию сортировки:

const qtr = ['zzqtr_1_2020','zzqtr_2_2020','zzqtr_3_2019','zzqtr_4_2019'];

qtr.sort((a, b) => {
  const aParts = a.split('_');
  const bParts = b.split('_');
  
  return (parseInt(aParts[2]) - parseInt(bParts[2])) || a.localeCompare(b);
});

console.log(qtr.join(', '));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...