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>

ローカルでライブラリを読み込めるのかな?