2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【JS】指定回数繰り返すfor文を、非破壊処理に変換する方法。 ...Array(n).map()

Last updated at Posted at 2020-11-11

n回など、指定回数だけ処理を繰り返す場合にfor文を使うが、これを非破壊で記述する具体的な方法について。

##目次

  1. for文の場合
  2. for文を使わない場合
  3. 何をしてるか?
    4. 変数(res)
    5. [...Array(n)]
    6. 配列.map((_, i) => {処理}
  4. 繰り返すのみの処理(インデックス番号不要の場合)
  5. 参考リンク

##for文の場合 一般的なfor文の場合、以下のように`i < n`と`i++`で処理回数を指定する。
for文の例
n = 5

for(i=0; i < n; i++){
    console.log("処理:" + i)
}
出力
処理:0
処理:1
処理:2
処理:3
処理:4

##for文を使わない場合 上記の処理をfor文を使わず非破壊処理で記述するには以下を使う。

変数 = [...Array(n).map()]

スプレッド構文、Array, mapメソッドを使用する。

非破壊処理の記述例
n = 5

const res = [...Array(n)].map((_, i) => 
   console.log("処理:" + i)
)

こちらも全く同じ結果が得られる。

出力
処理:0
処理:1
処理:2
処理:3
処理:4

##何をしてるか?
res = [...Array(n)].map((_, i) => {処理}

###1. 変数(res)
処理結果を代入する変数。何でもいい。

...配列のように、スプレッド構文で配列を展開する場合、別の変数に代入する必要がある。

[...Array(n)]だけの場合エラーになる。

エラー
Uncaught SyntaxError: Unexpected token '...'

###2. [...Array(n)] これが核となる処理。

####2-1. Array( )
Array( )は新しいArrayオブジェクトを作成する処理。カッコの中にある値を[ ]で囲む処理となる。


####2-2. Array(整数) Array( )の引数に整数を渡した場合、指定した数の**空の要素**が入った配列を作る。

※undefinedやnullではなく、完全に空(empty)となる。

空の配列の例
console.log(Array(5))

//出力
[empty × 5]

例えば、整数に5を指定すると、emptyが5回繰り返される。
この状態ではmapメソッドを使っても要素を取り出すことはできない

次の処理で、emptyをundefinedに変換する。


####2-3. [...Array(整数)] スプレッド構文と[ ]を使うことで、**空(empty)をundefinedに変換**することができる。

まずは、スプレッド構文を使い、[empty × 5]のカッコを外す。この時点で、要素にundefinedが入る

emptyをundefinedに置き換える
console.log(...Array(5))

//出力
undefined undefined undefined undefined undefined

この処理に[ ]を付ければ、指定した数だけundefinedが入った配列が出来上がる。

配列にする
console.log([...Array(5)])

//出力
[undefined undefined undefined undefined undefined]

###3. 配列.map((_, i) => {処理} mapで配列の要素を一つづつ取り出し、**要素の数だけ処理を繰り返す**。

.map(要素用の変数, インデックス番号用の変数)

要素undefinedはどうでもいいので、明示的に「 _ 」とする

今回の処理はインデックス番号を使うので、第2引数でインデックス番号を格納する変数を用意する。(例ではiを使用)

これで指定回数分だけ処理を繰り返すことができる。


##繰り返すのみの処理(インデックス番号不要の場合) 実行する処理でインデックス番号が不要の場合はもっとシンプルに書ける。
インデックス番号を使わない場合

const res = [...Array(n)].map( _ => 
   console.log("処理")
)

##参考リンク for文を使わない方法は、今回使用した`[...Array].map()`以外にも再起処理を使うなどいくつかあります。

[stack overflow] forを使わずに指定回数繰り返す方法(英語)

2
1
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?