[0, 1, 2, 3]
や [1, 2, 4, 8, 16]
のような配列をなるべく1行で作りたい時のメモ
- コツ
- 種となる配列をnew Array(num)で作成するのではなくArray.apply(null,new Array(num))で作成する
- new Array(num)で作成してしまうとmapが反応してくれません
連番
- 長さ20の0から始まる連番をつくって
arr
に入れる
var length=20;
var start=0;
var arr = Array.apply(null,new Array(length)).map(function(v,i){ return start+i;});
- 結果
[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0]
等差数列
- 長さ20で、初項4、公差2の等差数列をつくって
arr
に入れる
var length=20;
var initial=4;
var diff=2;
var arr = Array.apply(null,new Array(length)).map(function(v,i){ return initial+(i*diff);});
- 結果
[4.0, 6.0, 8.0, 10.0, 12.0, 14.0, 16.0, 18.0, 20.0, 22.0, 24.0, 26.0, 28.0, 30.0, 32.0, 34.0, 36.0, 38.0, 40.0, 42.0]
等比数列
- 長さ20で、初項4、公比2の等比数列をつくって
arr
に入れる
var length=20;
var initial=4;
var ratio=2;
var arr = Array.apply(null,new Array(length)).map(function(v,i){ return initial*Math.pow(ratio,i);});
- 結果
[4.0, 8.0, 16.0, 32.0, 64.0, 128.0, 256.0, 512.0, 1024.0, 2048.0, 4096.0, 8192.0, 16384.0, 32768.0, 65536.0, 131072.0, 262144.0, 524288.0, 1048576.0, 2097152.0]
解説
- new Array(length).mapでは駄目な理由
-
new Array(length)
で作成した配列は、各要素に値が入っていません。 - mapによる処理は 値の入っている要素に対してしか発生しません 。
- 以上のことから例えば
new Array(10).map(~)
とやっても何も実行されない結果となります。
-
- Array.apply(null,new Array(length)).mapならよい理由
-
Array.apply(null,new Array(3))
はArray(null,null,null)
のように解釈されます - この結果、
[null, null, null]
のように 各要素にnull
が入った 配列が生成されます。 - mapは値の入っている要素であれば(それがnullであっても)反応するため、
Array.apply(null,new Array(3)).map(~)
とすれば、各要素に対してmapによる処理が実行されます。
-