Как объединить числа из массива в диапазоны?
Есть массив с числами, нужно вывести его значения в строку, объединив при этом ближайшие числа в диапазоны:
Например: [2,3,5,10,15,16] на выходе должно получиться: 2-5, 10, 15-16
Решение есть, но кажется избыточным, хочется либо оптимизировать это,
const numbers = document.querySelector('.numbers');
const arr = [1, 3, 5, 6, 7, 10, 15, 16]
const arrayToRange = (arr) => {
const result = [];
let start = '';
for (let i = 0; i < arr.length; i++) {
if (arr[i + 1] - arr[i] !== 1) {
if (start === '') {
result.push(arr[i]);
} else {
const str = `${start}-${arr[i]}`;
start = '';
result.push(str);
}
} else {
if (start === '') {
start = arr[i];
}
}
}
return result;
};
const result = arrayToRange(arr);
numbers.innerText = result;
<p class="numbers"></p>
либо найти более простое.
Ответы (1 шт):
Автор решения: Spatz
→ Ссылка
Можно использовать метод reduce сравнивания предыдущее и следующее значение с текущим:
const src = [1, 3, 5, 6, 7, 10, 15, 16]
const res = src.reduce((acc, cur, idx, arr) => (cur - 1) === arr[idx - 1] ? (cur + 1) === arr[idx + 1] ? acc : `${acc}-${cur}` : `${acc}, ${cur}`)
console.log(res)