Quantcast
Channel: 配列タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 757

JavascriptでRange関数を書いてみた

$
0
0

Javascriptの組み込み関数には連番入った配列を返すような「Range関数」がない。
もしあれば、for-of文などと組み合わせて簡潔に書ける処理が増えるだろう。

使用イメージ
for(constvalueofRange(10,20)){//value = 10, 11, 12, ... 19}

実際に書いてみる

パフォーマンスなどは無視して、単純に書くと配列を返す処理になるだろう。
しかし、何万何十万という巨大な連番を振る場合には不都合が大きい。
要は iteratable を返せば良いのでジェネレーター関数とすれば良いだろう。

Range( [start,] end [, step] )
function*Range(...args){letstart,end,step;switch(args.length){case0:thrownewTypeError("argument expected");case1:[end]=args;break;case2:[start,end]=args;break;default:[start,end,step]=args;break;}[start,end]=[start,end].map(val=>val==null?0:Number(val));if(step==null)step=start<end?1:-1;elsestep=Number(step);if(![start,end,step].some(isFinite))thrownewTypeError("illegal argument");if(step==0)thrownewTypeError("illegal argument");elseif(step<0)if(start<end)thrownewTypeError("illegal argument");elsefor(letvalue=start;value>=end;value+=step)yieldvalue;elseif(start>end)thrownewTypeError("illegal argument");elsefor(letvalue=start;value<=end;value+=step)yieldvalue;}

start と step は省略可能で、どの引数も負数を指定しても動くようになっている。
number 型として解釈できない値か、有限値以外の場合はNGになる。

使用例
constmaru=String.fromCharCode(...Range(13008,13054));console.time("TEST 1");for(consttimesofRange(100000)){//TEST}console.timeEnd("TEST 1");

Viewing all articles
Browse latest Browse all 757

Trending Articles