var convertToRanges = function (str) {
// split the string at the commas and map it to an array of ints
// NOTE: if you are passing an array, skip this step
var pieces = str.split(",").map(Number)
// ranges will be an array of arrays
// each inner array will have 2 dimensions, representing the start/end
// of a range
// we want to initialize our first range to pieces[0], pieces[0],
// or (only the first element)
, ranges = [[pieces[0], pieces[0]]]
// last index we accessed (so we know which range to update)
, lastIndex = 0;
for (var i = 1; i < pieces.length; i++) {
// if the current element is 1 away from the end of whichever range
// we're currently in
if (pieces[i] - ranges[lastIndex][1] === 1) {
// update the end of that range to be this number
ranges[lastIndex][1] = pieces[i];
} else {
// otherwise, add a new range to ranges
ranges[++lastIndex] = [pieces[i], pieces[i]];
}
}
return ranges;
}
This will return an array of arrays:
console.log(convertToRanges("1,2,3,4,6,7,8,9,11,12,13,14,16,17,18,19"));
// -> [ [1, 4], [6, 9], [11, 14], [16, 19] ]
I'll leave it to you to figure out how to transform this to look like "1-4,6-9,11-14,16-20"
Hint: use Array.prototype.map
and Array.prototype.join