Edited at

jsでrange関数をつくる

More than 3 years have passed since last update.

ブラウザのコンソールでrangeの作り方を試行錯誤してる記事を見つけました。

飛び飛びArrayのイテレート - Qiita

Array.fromあまり使ったことがなかったので、なるほどという感じです。

今回は、自分なりにrange関数を考えたいと思います。

動作確認はモダンブラウザ(Chrome49)及びnode5.9で行いました。


Array.from

さて、上記の記事にもある通り、まずはArray.fromを使ってみます。

Array.from() - JavaScript | MDN

をみると、Array.fromは任意で配列のすべての要素に対して呼び出されるMap関数を引数にとれます。

とゆうかMDNの例のなかに目当てのものがいますね。完。

// Generate a sequence of numbers

Array.from({length: 5}, (v, k) => k);
// [0, 1, 2, 3, 4]

とここで終わってもあれなのでもう少し見ていくことにします。


Array

仕様を確認したらnewをしなくてもコンストラクタが呼ばれて配列が返ります。

なので、下のように書けます。

Array.from(Array(5), (v, k) => k)

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

{length: 5}よりArray(5)のほうが多少書きやすいですね。


Spread operator

雑に言うと、...で配列を展開することができます。

これを使うと以下のように書くことができます。

[...Array(5)]

// [ undefined, undefined, undefined, undefined, undefined ]

[...Array(5).keys()]
// [ 0, 1, 2, 3, 4 ]

ずいぶんシンプルになりました。


まとめ

ブラウザでさくっと使うなら、var range = n => [...Array(n).keys()];あたりでしょうか。

es6さまさまです。