JavaScript是否具備相似「 range()」的方法來在提供的範圍內生成範圍?

在PHP中,您能夠... javascript

range(1, 3); // Array(1, 2, 3)
range("A", "C"); // Array("A", "B", "C")

也就是說,有一個函數可讓您經過傳遞上下限來得到必定範圍的數字或字符。 java

爲此,JavaScript是否內置任何內置功能? 若是沒有,我將如何實施? git


#1樓

號碼 es6

[...Array(5).keys()];
 => [0, 1, 2, 3, 4]

角色迭代 github

String.fromCharCode(...[...Array('D'.charCodeAt(0) - 'A'.charCodeAt(0) + 1).keys()].map(i => i + 'A'.charCodeAt(0)));
 => "ABCD"

迭代 chrome

for (const x of Array(5).keys()) {
  console.log(x, String.fromCharCode('A'.charCodeAt(0) + x));
}
 => 0,"A" 1,"B" 2,"C" 3,"D" 4,"E"

做爲功​​能 數組

function range(size, startAt = 0) {
    return [...Array(size).keys()].map(i => i + startAt);
}

function characterRange(startChar, endChar) {
    return String.fromCharCode(...range(endChar.charCodeAt(0) -
            startChar.charCodeAt(0), startChar.charCodeAt(0)))
}

做爲鍵入函數 瀏覽器

function range(size:number, startAt:number = 0):ReadonlyArray<number> {
    return [...Array(size).keys()].map(i => i + startAt);
}

function characterRange(startChar:string, endChar:string):ReadonlyArray<string> {
    return String.fromCharCode(...range(endChar.charCodeAt(0) -
            startChar.charCodeAt(0), startChar.charCodeAt(0)))
}

lodash.js _.range()函數 app

_.range(10);
 => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
_.range(1, 11);
 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
_.range(0, 30, 5);
 => [0, 5, 10, 15, 20, 25]
_.range(0, -10, -1);
 => [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
String.fromCharCode(..._.range('A'.charCodeAt(0), 'D'.charCodeAt(0) + 1));
 => "ABCD"

沒有庫的舊的非es6瀏覽器: jsp

Array.apply(null, Array(5)).map(function (_, i) {return i;});
 => [0, 1, 2, 3, 4]

console.log([...Array(5).keys()]);

謝謝。

(ES6歸功於nils petersohn和其餘評論者)


#2樓

使用除IE11以外的全部瀏覽器都支持的 Harmony生成

var take = function (amount, generator) {
    var a = [];

    try {
        while (amount) {
            a.push(generator.next());
            amount -= 1;
        }
    } catch (e) {}

    return a;
};

var takeAll = function (gen) {
    var a = [],
        x;

    try {
        do {
            x = a.push(gen.next());
        } while (x);
    } catch (e) {}

    return a;
};

var range = (function (d) {
    var unlimited = (typeof d.to === "undefined");

    if (typeof d.from === "undefined") {
        d.from = 0;
    }

    if (typeof d.step === "undefined") {
        if (unlimited) {
            d.step = 1;
        }
    } else {
        if (typeof d.from !== "string") {
            if (d.from < d.to) {
                d.step = 1;
            } else {
                d.step = -1;
            }
        } else {
            if (d.from.charCodeAt(0) < d.to.charCodeAt(0)) {
                d.step = 1;
            } else {
                d.step = -1;
            }
        }
    }

    if (typeof d.from === "string") {
        for (let i = d.from.charCodeAt(0); (d.step > 0) ? (unlimited ? true : i <= d.to.charCodeAt(0)) : (i >= d.to.charCodeAt(0)); i += d.step) {
            yield String.fromCharCode(i);
        }
    } else {
        for (let i = d.from; (d.step > 0) ? (unlimited ? true : i <= d.to) : (i >= d.to); i += d.step) {
            yield i;
        }
    }
});

例子

採起

範例1。

take只須要儘量多的,由於它能夠獲得

take(10, range( {from: 100, step: 5, to: 120} ) )

退貨

[100, 105, 110, 115, 120]

示例2

to不neccesary

take(10, range( {from: 100, step: 5} ) )

退貨

[100, 105, 110, 115, 120, 125, 130, 135, 140, 145]

takeAll

範例3。

from沒必要要

takeAll( range( {to: 5} ) )

退貨

[0, 1, 2, 3, 4, 5]

範例4。

takeAll( range( {to: 500, step: 100} ) )

退貨

[0, 100, 200, 300, 400, 500]

示例5

takeAll( range( {from: 'z', to: 'a'} ) )

退貨

["z", "y", "x", "w", "v", "u", "t", "s", "r", "q", "p", "o", "n", "m", "l", "k", "j", "i", "h", "g", "f", "e", "d", "c", "b", "a"]


#3樓

簡單範圍功能:

function range(start, stop, step) {
    var a = [start], b = start;
    while (b < stop) {
        a.push(b += step || 1);
    }
    return a;
}

要合併BitInt數據鍵入一些檢查能夠包括在內,以確保全部的變量都相同typeof start

function range(start, stop, step) {
    var a = [start], b = start;
    if (typeof start == 'bigint') {
        stop = BigInt(stop)
        step = step? BigInt(step): 1n;
    } else
        step = step || 1;
    while (b < stop) {
        a.push(b += step);
    }
    return a;
}

#4樓

這是個人2美分:

function range(start, count) {
  return Array.apply(0, Array(count))
    .map((element, index) => index + start);
}

#5樓

對各類範圍函數作了一些研究。 檢驗一下jsperf作這些功能的不一樣方法的比較 。 固然不是一個完美或詳盡的清單,但應該有所幫助:)

獲勝者是...

function range(lowEnd,highEnd){
    var arr = [],
    c = highEnd - lowEnd + 1;
    while ( c-- ) {
        arr[c] = highEnd--
    }
    return arr;
}
range(0,31);

從技術上講,它不是在Firefox上最快的,可是在chrome上瘋狂的速度差別(imho)彌補了這一點。

一樣有趣的觀察是這些數組函數的chrome比firefox快多少。 Chrome至少快4到5倍

相關文章
相關標籤/搜索