JavaScriptで範囲を示す配列(数列)を生成する方法

作成日:

本ページではJavaScriptを利用して範囲指定の数値配列 (PHP や Pythonで言うところの range で生成する配列) を作成する方法を説明します。

方法#

以下の関数を利用します。

const range = (start, stop, step=1) => Array.from(
    { length: (stop - start) / step + 1},
    (_, i) => start + (i * step)
);

上記の関数を利用して数列を宣言することができます。

range(1, 10)
// => [ 1 ,2, 3, 4, 5, 6, 7, 8, 9, 10 ]
range(1, 10, 2)
// => [ 1, 3, 5, 7, 9 ]
range(10, 1, -2)
// => [ 10, 8, 6, 4, 2 ]

解説#

ある値からある値までの連番の数値配列、いわゆる等差数列を生成する関数は PHPPython において range という関数としてデフォルトで存在しています。しかしJavaScriptには存在していないため、自作してしまうというのが本ページの内容です。

本ページでは range 関数を Arrayfrom() という関数を利用して実現しています。引数の内容は以下の通りです。

range の引数

引数名

意味

start

数列の最初の値

start

数列の最後の値

step

要素の増加数 (default = 1)

本ページでの Array.from() の使われ方の説明#

本ページの range 関数の内容を解説します。

Array.from() 関数の宣言内容と引数の説明は MDNのドキュメント によると下記の通りです。

Array.from(arrayLike[, mapFn[, thisArg]])
Array.from() の引数

引数名

意味

arrayLike

配列に変換する配列のようなオブジェクトまたは反復可能オブジェクト

mapFn

配列のすべての要素に対して呼び出される Map 関数。

thisArg

mapFn を実行する時に this として使用する値。

上記の range 関数ではこの引数たちのうち、 arrayLikemapFn を利用しています。

arrayLike#

arrayLike は名前の通り「配列のようなオブジェクト」をとる引数です。

配列のようなオブジェクト、として今回の例では length プロパティを持つオブジェクトを渡しています。

{ length: 10 }
// => length プロパティを持つオブジェクト

mapFn#

mapFn はMap関数を受け取る引数です。

何に対して map が実行されるかというと、 arrayLikeArray が受け取って生成した配列です。つまり

Array.from({ length: 10 }, mapFn)

は以下と同義です[1]

Array.from({ length: 10 }).mapFn()

map 関数が受け取る引数は 1つ目が各要素の値、2つ目が各要素のインデックス、3つ目の引数が配列そのもの、となりますので本ページの range 関数で利用している以下のmap関数は

(_, i) => start + (i * step)

現在の値を読み捨て、 インデックスに応じた要素の値を設定し return しているということになります。

JavaScript
Node.js