На входе есть массив
['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)
Вам нужна симметричная сортировка, а не логическое значение для возврата только одного или двух значений.
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);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Делаю игру, похожую на agario, имеется много клиентов, реализовано с помощью socket
Привет! Есть такая проблема, есть категории(тип, торговая марка) у них есть подкатегорииУсловный бренд а, б, в