Некорректная работа метода sort() на Node v.8.1.3?

136
05 октября 2021, 04:30

На входе есть массив

['1:nnn','1:vvv','2:zzz','1:yy','1:cc','2:xx','2:uu','2:tt','2:qq','2:aa','1:ff','1:ll','1:pp']

Необходимо задать компаратор в методе sort() таким образом, чтобы массив отсортировался по следующему принципам:

1) Сохранить первоначальную сортировку по длине элементов (не менять местами элементы разной длины, например элементы 1:nnn и 1:yy)

2) Если элементы одинаковой длины, то сравнивать первый символ каждого элемента, сначала должны идти элементы с префиксом 1, затем элементы с префиксом 2.

Я попытался написать следующий код, но не могу понять почему он не работает так, как хотелось бы на Node v.8.1.3? Некорректный результат, который я получаю, выглядит вот так:

['2:uu','1:nnn','1:ll','1:yy','1:cc','2:xx','1:ff','2:tt','2:qq','2:aa','1:vvv','2:zzz','1:pp']

Если запускать код в браузере или в стаковерфлоу, то я получаю ожидаемый результат

["1:nnn","1:vvv","2:zzz","1:yy","1:cc","1:ff","1:ll","1:pp","2:xx","2:uu","2:tt","2:qq","2:aa"]

В чём может быть проблема и что я делаю не так?

let output=['1:nnn','1:vvv','2:zzz','1:yy','1:cc','2:xx','2:uu','2:tt','2:qq','2:aa','1:ff','1:ll','1:pp'] 
 
output.sort((a,b) => { 
  if(a.length===b.length) { 
     if ((+a.slice(0,1))<(+b.slice(0,1))) return -1  
     else return 1 
  } else return 0 
}) 
 
console.log(output)

Answer 1

Вам нужна симметричная сортировка, а не логическое значение для возврата только одного или двух значений.

Array#sort ожидает три значения, в зависимости от требуемого и заданного порядка, но ваш результат пропускает одно значение, которое может быть важным, в зависимости от реализации алгоритма сортировки.

Вместо этого вы можете вернуть дельту значений и получить идеально отсортированный результат, независимо от реализации алгоритма сортировки.

let output=['1:nnn','1:vvv','2:zzz','1:yy','1:cc','2:xx','2:uu','2:tt','2:qq','2:aa','1:ff','1:ll','1:pp'] 
 
output.sort((a, b) => b.length - a.length || a.split(':', 1) - b.split(':', 1)); 
 
console.log(output);

READ ALSO
Ошибка при запуске task(а) gulp

Ошибка при запуске task(а) gulp

Я скачал node js вот этой версии:

208
Как сделать переподключение клиента, socket.io

Как сделать переподключение клиента, socket.io

Делаю игру, похожую на agario, имеется много клиентов, реализовано с помощью socket

386
Отсеивание по категориям React

Отсеивание по категориям React

Привет! Есть такая проблема, есть категории(тип, торговая марка) у них есть подкатегорииУсловный бренд а, б, в

171