function parseRange

Creates an array from a "range string" Examples: "3:8,1,2" => [3,4,5,6,7,8,1,2] "1:2:9" => [1,3,5,7,9]

by Santiago J

HTML

<input type="text" id="rangestr" value="10:2:0">
<button onclick="log(parseRange($('#rangestr').value));">Parse Range String</button><br>
<textarea id="log"></textarea>

CSS

#log {
    width: 400px;
    height: 400px;
}

JavaScript

/* Log utils */
function $(s, a) { return document["querySelector" + (a ? "All" : "")](s); }
function log(s) { $("#log").value += s + "\n"; }

// parseRange creates an array from a range string.
// The range string can be formatted in one of two ways:
// "start:stop" or "start:step:stop"
// The step parameter will default to 1 when omitted.
//
// Examples:
// parseRange("1:5")    =>  [1,2,3,4,5]
// parseRange("3:-3")   =>  [3,2,1,0,-1,-2,-3]
// parseRange("3:2:9")  =>  [3,5,7,9]

function parseRange(rstr) {
    var parts = rstr.replace(/[^\d\-:,]/g, "").split(","),
        rarr = [],
        i, seg, start, stop, step, n;

    for (i = 0; i < parts.length; i++) {
        seg = parts[i].split(":");
        if (seg.length < 1 || seg.length > 3) throw new Error("Malformed range string.");
        if (seg.length === 1) {
            rarr.push(+seg[0]);
        } else {
            start = +seg[0];
            step = seg.length === 3 && +seg[1] || 1;
            stop = seg.length === 2 ? +seg[1] : +seg[2];
            if (stop > start ? step < 0 : step > 0) step = -step;
            for (n = start; step > 0 ? n <= stop : n >= stop; n += step) rarr.push(n);
        }
    }
    return rarr;
}

window.onload = function(){
    log(parseRange("1:5,11,12")); // => [1,2,3,4,5,7,9,11,13]
    log(parseRange("50:5:100")); // => [50,55,60,65,70,75,80,85,90,95,100]
    log(parseRange("1:5,5,5,6:2:10")); // => [1,2,3,4,5,5,5,6,8,10]
    log(parseRange("100:20:-100")); // => [100,80,60,40,20,0,-20,-40,-60,-80,-100]
}