Вопрос автору, где такие задачи задают?
Мой код, решение универсальное работает с повторениями. По классике
function range (a) {
if (a.length < 2) return a
a.sort( (a, b) => a-b )
let pred = null
let e = false
let result = ''
for (let i of a) {
if (pred === null) {
result = pred = i
continue
}
if (i != pred+1 ) {
e ? result += '-' + pred + ', ' + i : result += ', ' + i
e = false
} else e = true
pred = i
}
if (e) result += '-' + pred
return result
}
console.log(range([1, 4, 5, 2, 3, 9, 8, 11, 0]))
console.log(range([1, 4, 3, 2]))
console.log(range([1, 4, 8]))
Или так
function range (a) {
a.sort( (a, b) => a-b )
a = [...a,'']
return a.reduce((st, item, i, arr) => i==0 ? st += item : ( item != arr[i-1]+1 ) ? st += '-' + arr[i-1] + ', ' + item : st = st, '')
.split(',')
.map((item) => (eval(item) == 0 ? item.slice(0, item.indexOf('-')) : item).trim())
.slice(0, -1)
.join(', ')
}
console.log(range([1, 4, 5, 2, 3, 9, 8, 11, 0]))
console.log(range([1, 4, 3, 2]))
console.log(range([1, 4, 8]))
И для полной идиоматичности сделаем так
const range = a => [...a.sort( (a, b) => a-b ),''].reduce((st, item, i, arr) => i==0 ? st += item : ( item != arr[i-1]+1 ) ? st += '-' + arr[i-1] + ', ' + item : st = st, '')
.split(',')
.map((item) => (eval(item) == 0 ? item.slice(0, item.indexOf('-')) : item).trim())
.slice(0, -1)
.join(', ')
console.log(range([1, 4, 5, 2, 3, 9, 8, 11, 0]))
console.log(range([1, 4, 3, 2]))
console.log(range([1, 4, 8]))