[JavaScript] Генерация массива вида 1,2…100

Вариант «для самых маленьких»:

function range() {
    var r = [];
    for (var i = 1; i <= 100; i++) r.push(i);
    return r;
}

Хочу сам задавать границы:

function range(a, b) {
    if (a >= b) return [];
    var r = [];
    for (var i = a; i <= b; i++) r.push(i);
    return r;
}

Хочу, не +1, а любой шаг

function range(a, b, s) {
    if (a >= b) return [];
    var r = [],
        i = a;
    while (i <= b) {
        r.push(i);
        i += s;
    }
    return r;
}

Хочу, что бы шаг можно было задавать отрицательный. На этом этапе мне надоело писать костыль и решил поискать вмеру универсальное решение. Нашел его в библиотеке d3. Код функции range описан в файле arrays/range.js. Код вообще отличный и заточен под целый ворох потенциальных «хотелок». Понятно, что ради одного метода подключать такую библиотеку — не вариант. Зависимостей в данной функции не так много и отделить ее от остального кода не составляет труда:

function range(start, stop, step) {
    if (arguments.length < 3) {
        step = 1;
        if (arguments.length < 2) {
            stop = start;
            start = 0;
        }
    }
    if ((stop - start) / step === Infinity) throw new Error("infinite range");
    var range = [],
        k = 1,
        x = Math.abs(step),
        i = -1,
        j;
    while (x * k % 1) k *= 10;
    start *= k, stop *= k, step *= k;
    if (step < 0)
        while ((j = start + step * ++i) > stop) range.push(j / k);
    else
        while ((j = start + step * ++i) < stop) range.push(j / k);
    return range;
};

Или в сжатом виде:

function range(e,t,n){if(arguments.length<3){n=1;if(arguments.length<2){t=e;e=0}}if((t-e)/n===Infinity)throw new Error("infinite range");var r=[],i=1,s=Math.abs(n),o=-1,u;while(s*i%1)i*=10;e*=i,t*=i,n*=i;if(n<0)while((u=e+n*++o)>t)r.push(u/i);else while((u=e+n*++o)<t)r.push(u/i);return r}

, , ,

Оставить комментарий

Top ↑ | Main page | Back