在PHP中,您能夠... javascript
range(1, 3); // Array(1, 2, 3) range("A", "C"); // Array("A", "B", "C")
也就是說,有一個函數可讓您經過傳遞上下限來得到必定範圍的數字或字符。 java
爲此,JavaScript是否內置任何內置功能? 若是沒有,我將如何實施? git
號碼 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和其餘評論者)
使用除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"]
簡單範圍功能:
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; }
這是個人2美分:
function range(start, count) { return Array.apply(0, Array(count)) .map((element, index) => index + start); }
對各類範圍函數作了一些研究。 檢驗一下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倍 。