36

この記事は最終更新日から1年以上が経過しています。

投稿日

更新日

ES6以降のJavaScript/TypeScriptで0...N-1の配列を作る

動機

JavaScript/TypeScriptで定数(N)で決められた数だけループしたい時、

const N = 100;
for(let i = 0; i < N; i++){
   //...なんか処理
}

こんなダサいループは書きたく無い。。。

pythonのrange(N)みたいなのがJavaScriptにもあったらなぁ。。。

解決策

英語でググってみたらStackOverflowに良い解決策が載っていたのでご紹介。

世界には頭の良い人がいるものだなぁ。

const N = 100;
[...Array(N).keys()].forEach(i => {
   //...なんか処理(iには0...N-1(=99)が格納される)
});

もし1...Nにしたければ、

const N = 100;
[...Array(N).keys()].map(n => n + 1); // [1,2,3,...,100]

こんな具合にmapしてズラしてあげればOK。

応用

ということはもしかして、FizzBuzzがワンライナーで書けるんじゃないか...?

[...Array(100).keys()].map(n => n + 1).map(n => n % 15 === 0 ? 'FizzBuzz' : n % 3 === 0 ? 'Fizz' : n % 5 === 0 ? 'Buzz' : n.toString()).forEach(s => console.log(s));

出来た。

一応解説すると、

[...Array(100).keys()] // [0,1,2, ... ,99]の配列を作る
   .map(n => n + 1)    // mapでズラして[1,2,3, ... , 100]にする
   .map(n => n % 15 === 0 ? 'FizzBuzz' : n % 3 === 0 ? 'Fizz' : n % 5 === 0 ? 'Buzz' : n.toString()) // FizzBuzzのルールを満たすように文字列に変換する
   .forEach(s => console.log(s)); //1行ずつ出力する

この.map().forEach()を繋げて書く表記に慣れていない方は、手前味噌で恐縮ですが私の過去記事をご覧ください。

(ちなみに)indexを使用しない場合

生成した配列の中身の数値を使わず、単にN回ループしたい場合は[...Array(N)]で良いらしい。

// 長さが100の0から99までのランダムな整数の配列を作成
const randomInt = [...Array(100)].map(() => Math.floor(Math.random() * 100));

追記(2020/09/22)

この記事に対して別途SNSで頂いたコメントを元に続きを書きました。
ぜひ合わせてご一読ください。

なぜ我々は頑なにforを避けるのか

新規登録して、もっと便利にQiitaを使ってみよう

  1. あなたにマッチした記事をお届けします
  2. 便利な情報をあとで効率的に読み返せます
ログインすると使える機能について
この記事は以下の記事からリンクされています

コメント

keys の代わりに引数でもできますね。


[...Array(100)].forEach((_, i) => {
   //...なんか処理(iには0...N-1(=99)が格納される)
});

[...Array(100)].map((_, i) => {
   //...なんか処理(iには0...N-1(=99)が格納される)
});
4

Array(N).keys() のままだとArray.prototype を継承していないとは知りませんでした。
スプレッド構文で分解してarrayに入れ直してしまうとは、普通じゃ思いつかない…

for of 文だと問題なく書けました。こっちのほうが私は好きです。

const N = 100;
for(const i of Array(N).keys()){
    console.log(i);
}
0

こんな記事もありました。リンクしておきます。

[...Array(n).keys()] はやめた方がいいのでは?
https://zenn.dev/uhyo/articles/array-n-keys-yamero

0
あなたもコメントしてみませんか :)
新規登録
すでにアカウントを持っている方はログイン
記事投稿キャンペーン開催中
みんなでAWSの知見を共有しよう
~
新人プログラマ応援 - みんなで新人を育てよう!※期間延長
~
36