94010


# 目的

数を指定して関数に渡します。  
そうすると配列が作られて、1,2,3,4と順に配列に組み込まれていきます。  
指定された数になるとその数が代入されてそこで止まり、配列が返されると思っていました。

よろしくお願いします。

# 原始コード

[code]

    const createNum = (maxNum) => {
    const ary_result = [];
    for (let index = 1; index < maxNum; index++) {
        ary_result.push(index);
        if (index === maxNum) {
            return ary_result;
        }
    }
    };
    console.log(createNum(100));
    
    //result
    // [1,2,3, ... ,100] となるはずだった
[/code]


CC BY-SA 4.0
2023-02-26T09:49:17.827
94009
2023-09-16T02:42:47.230
2023-09-16T02:42:47.230
53242
53242
question
javascript array
「1」から「指定された数」までの数列を配列で作りたい

[code]

    for (let index = 1; index < maxNum; index++)
    
[/code]

のループ内の処理が実行されるのは`index`が`maxNum`未満の場合です。このため、次のロジックが実行されません。

[code]

        if (index === maxNum) {
            return ary_result;
        }
    
    
[/code]

for文を次のように変更し、

[code]

    for (let index = 1; index <= maxNum; index++)
    
[/code]

ループの終了時に復帰(`return ary_result;`)すればよいです。

[code]

    const createNum = (maxNum) => {
        const ary_result = [];
        for (let index = 1; index <= maxNum; index++) {
            ary_result.push(index);
        }
        return ary_result;
    };
    console.log(createNum(100));
[/code]


CC BY-SA 4.0
2023-02-26T10:01:23.050
94010
2023-02-27T10:19:06.843
2023-02-27T10:19:06.843
35558
35558
94009
answer


ちなみにJavaScriptには[ジェネレーター関数](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/function*)というものがあり、呼び出し毎に新たな値を返すことができます。また、[スプレッド構文](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax)というものがあり、反復可能オブジェクトから配列を構築することができます。両者を組み合わせることで、ものすごくシンプルに実現できます。

[code]

    function* createNum(maxNum) {
        var i = 1;
        while (i <= maxNum)
            yield i++;
    }
    console.log([...createNum(100)]);
[/code]


CC BY-SA 4.0
2023-02-27T03:07:04.853
94016
2023-02-27T03:07:04.853
4236
94009
answer


# 回答ではありません

ここまでのコードを何となく計測して、最後にArrayにサイズを指定して生成してみました。

[code]

    function* gen_createNum(maxNum) {
      var i = 1;
      while (i <= maxNum)
        yield i++;
    }
    const measure = (f, args) => {
      const s = new Date();
      const result = f(...args);
      console.log(new Date() - s);
      return result;
    };
    const creators = [
      (maxNum) => {
        const ary_result = [];
        for (let index = 1; index <= maxNum; index++) {
          ary_result.push(index);
        }
        return ary_result;
      },
      (maxNum) => [...gen_createNum(maxNum)],
      (maxNum) => {
        const ary_result = new Array(maxNum);
        for (let index = 0; index < maxNum; ++index) {
          ary_result[index] = index + 1;
        }
        return ary_result;
      },
    ];
    const results = creators.map((f) => measure(f, [1024 * 1024 * 16]));
[/code]

## 手元での実行結果

ちなみにWindows Firefox 110.0 64bitというありふれた環境ですが。。。

[code]

    297
    2799
    270
    
[/code]

同PCのvbox Ubuntu上のnode v16.18.0だと

[code]

    408
    1484
    103
    
[/code]

ですね。

## 追記

こんなに技術的に有為なことなのに **なぜかコメントもなくマイナス評価**
なので、k勝手ながら皆様の貧弱な環境で動作しないのではないかと思い、多少サイズを控えめにしてみました。


CC BY-SA 4.0
2023-02-27T07:22:09.173
94023
2023-02-27T07:56:50.170
2023-02-27T07:56:50.170
54957
54957
94009
answer