JSFiddle - React, Tailwind, and code Playground

by Sahin Deniz

JavaScript

function getRanges(values, separator = "-") {
  let fixed = [];

  let ranges = values
    .slice()
    .sort((p, q) => p - q)
    .reduce((acc, cur, idx, src) => {
      if (idx > 0 && cur - src[idx - 1] === 1) acc[acc.length - 1][1] = cur;
      else acc.push([cur]);
      return acc;
    }, [])
    .map(range => {
      let [n0, n1] = range;

      if (n0 + 1 !== n1) return range;

      fixed.push([n1]);

      return [n0];
    });
  ranges.push(...fixed);

  return ranges
    .sort()
    .map(range => range.join(separator));
}

console.log(getRanges([1, 2, 4, 5, 6, 7, 57]));