В вашем коде lastValue
никогда не изменяется в цикле, поэтому вы всегда будете сравнивать с первым элементом в массиве.Кроме того, когда вы находите совпадение, вы еще не готовы добавить результат pages
- возможно, будет еще несколько цифр.
Одним из подходов может быть сохранение последовательности текущей последовательности чисел (или только первого и последнего чисел в серии) и добавление этой серии к строке результата только тогда, когда мы находим разрыв в последовательностиили нажмите конец строки.
Есть много способов подойти к этому, и я рекомендую проверять ответы других людей на Codewars: Range Extraction kata, который (почти) идентиченк этой проблеме.
Вот мое решение:
const rangeify = a => {
const res = [];
let run = []
for (let i = 0; i < a.length; i++) {
run.push(a[i]);
if (i + 1 >= a.length || a[i+1] - a[i] > 1) {
res.push(
run.length > 1 ? `${run[0]}-${run.pop()}` : run
);
run = [];
}
}
return res.join(", ");
};
[
[1,2,3,4,7,8,9,13,16,17],
[],
[1],
[1, 2],
[1, 3],
[1, 2, 3, 8],
[1, 3, 4, 8],
[1, 1, 1, 1, 2, 3, 4, 5, 5, 16],
[-9, -8, -7, -3, -1, 0, 1, 2, 42]
].forEach(test => console.log(rangeify(test)));