javasriptでも楽に配列を生成したかった。
他の言語だと楽に配列を生成することができる。
rubyだと
(0..9).to_a
pythonだと
[i for i in range(10)]
でも,javascriptだと
var a=[]; for (var i=0; i<10; i++){a[i] = i}
と書かなくてはいけないです。
for文を書くのはとても面倒です。
なので、楽に配列が作成できる関数を作ってみることにしました。
こんな感じにしたい。
var a = array_from_range(0,10) // array_from_rangeというのがこれから作る関数の名前。 //a = [0,1,2,3,4,5,6,7,8,9]という配列が手に入る。
どうせだから、以下のように書いても動くようにしたい。
var a = array_from_range(10);
さっそく作成
その前に引数がたりなかった時どうなるか確認
(function(a,b){print(b);})(1); //undefined
これで作れそう。作ってみる。
function array_from_range(start, end){ if (end == undefined){ n = start; start = 0; } else{ n = end - start; } var a=[]; for (var i=0; i<n; i++){ a[i] = start+i; } return a }
動作確認
print(array_from_range(10,20));
//10,11,12,13,14,15,16,17,18,19
print(array_from_range(10));
0,1,2,3,4,5,6,7,8,9
わー、動いたぱちぱち。
どうせなので
関数を渡せるといいなー。ということで改良する。
引数の数で動作を変えると良いかもしれない。引数の数はどうなっているか調べておこう。
print((function(a){return arguments.length})(1,2)) //2
argymentsは渡された引数以外は保持していないみたい。
関数内での関数だとどうなるんだろ。
(function(){ print(arguments.length); (function(){print(arguments.length)})(1,2,3); })("a", "b") //2 //3
実際に作ってみたところ、こんな感じになりました。
function array_from_range2() { var make_array = function(start,n) { var a = []; //print(arguments.length); if (arguments.length == 3) for (var i = 0; i<n; i++) { a[i] = arguments[2](start+i); } else for (var i = 0; i<n; i++) { a[i] = start+i; } return a; } //ここでどういう風に呼び出すか決める。 switch(arguments.length){ case 1 : return make_array(0,arguments[0]); case 2 : return make_array(arguments[0], arguments[1] - arguments[0]); case 3 : return make_array(arguments[0], arguments[1], arguments[2]); //rubyのfunc(*array)みたいに配列を展開して渡すようなことはできないのかな? default : return } }
ちょっと長すぎるかもしれない。でもせっかく作ったので動作確認をする。
print(array_from_range2(9)); //0,1,2,3,4,5,6,7,8 print(array_from_range2(10,20)); //10,11,12,13,14,15,16,17,18,19 print(array_from_range2(1,10, function(){return Math.round(Math.random()*1000)})) //218,58,21,263,730,659,924,743,862,743
あれ?
javascriptってライブラリを読み込むときは、こんな感じにするんだったような気がする。
<script type="text/javascript" src="something.js"></script>
ローカルでライブラリを読み込めるのかな?