41

この単純な配列を動的に作成する最も効率的な方法は何ですか?

var arr = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];

変数から数値 10 を取得できるとしましょう

var mynumber = 10;
4

17 に答える 17

83
var arr = [];
for(var i=1; i<=mynumber; i++) {
   arr.push(i.toString());
}
于 2012-05-04T15:38:10.273 に答える
19

ES2015ではArray.from、次のようなメソッドを使用して単一の式で簡潔に実現できます。

Array.from({ length: 10 }, (_, idx) => `${++idx}`)

の最初の引数fromは、長さプロパティを提供するオブジェクトのような配列です。undefined2 番目の引数は、要求に応じてデフォルト値を調整されたインデックス値に置き換えることができるマップ関数です。仕様の確認はこちら

于 2016-09-25T17:29:26.713 に答える
15

更新:このようなマイクロ最適化は価値がありません。最近のエンジンは非常にスマートであるため、2020 年にはvar arr = [];.

これが私がそれを行う方法です:

var mynumber = 10;
var arr = new Array(mynumber);

for (var i = 0; i < mynumber; i++) {
    arr[i] = (i + 1).toString();
}

私の答えは皆とほぼ同じですが、私が何か違うことをしたことに注意してください。

  • 配列の長さを指定し、毎回強制的に展開しない方が良い

だから私は配列を作成しましたnew Array(mynumber);

于 2012-05-04T17:57:52.467 に答える
4

整数値の文字列バージョンを含む配列を作成したいだけのように聞こえます。簡単なアプローチ:

var arr = [];
for (var i = 1; i <= mynumber; i++) arr.push(""+i);

より興味深いバージョンについては、ジェネレーターを実行できます...

function tail(i, maxval) {
    return [i].concat(i < maxval ? tail(i+1, maxval) : []);
}

var arr = tail(1, mynumber);
于 2012-05-04T15:38:03.290 に答える
2
var arr = [];
while(mynumber--) {
    arr[mynumber] = String(mynumber+1);
}
于 2012-05-04T15:38:35.037 に答える
2

私は次のようにします。

var num = 10,
  dynar = [...Array(num)].map((_,i) => ++i+"");
console.log(dynar);

于 2016-10-12T14:38:49.950 に答える
1
var arr = [];
for(var i=1; i<=mynumber; i++) {
   arr.push("" + i);
}

JSPerfによると、これは Chrome の方が速いようですが、すべてブラウザに大きく依存することに注意してください。

このスニペットについて変更できる点は 4 つあります。

  1. forまたはを使用しwhileます。
  2. 順方向ループまたは逆方向ループを使用する (最初にスパース配列を逆方向に作成する)
  3. インデックスによる使用pushまたは直接アクセス。
  4. 暗黙的な文字列化を使用するか、明示的に を呼び出しますtoString

すべてのブラウザの合計速度は、このリストの各項目の各オプションがその特定のブラウザでどれだけ優れているかを組み合わせたものになります。

TL;DR: この特定の部分をマイクロ最適化しようとするのは、おそらく良い考えではありません。

于 2012-05-04T17:33:33.730 に答える
1

質問を読み間違えました、修正しました。試す:

var myNumber = 100,
    myarr = (function arr(i){return i ? arr(i-1).concat(i) : [i]}(myNumber));

楽しみのために、次のように拡張するArrayと:

Array.prototype.mapx = function(callback){
  return String(this).split(',').map(callback);
}

あなたが使用することができます:

var myNum = 100, 
    myarr = new Array(myNum).mapx(function(el,i){return i+1;});
于 2012-05-04T15:39:43.543 に答える
0

range組み込みの Pythonic のような関数があるかどうかを尋ねている場合は、ありません。あなたはそれをブルートフォースの方法で行う必要があります。多分rangyはあなたに興味があるでしょう。

于 2012-05-04T15:39:38.310 に答える
0

私たちの何人かは、パフォーマンスが良くない使用方法について言及しています。

function getArrayViaFrom(input) {
  console.time('Execution Time');
  let output = Array.from(Array(input), (value, i) => (i + 1).toString())
  console.timeEnd('Execution Time');

  return output;
}

function getArrayViaFor(input) {
  console.time('Execution Time 1');
  var output = [];
  for (var i = 1; i <= input; i++) {
    output.push(i.toString());
  }
  console.timeEnd('Execution Time 1');

  return output;
}

console.log(getArrayViaFrom(10)) // Takes 10x more than for that is 0.220ms
console.log(getArrayViaFor(10))  // Takes 10x less than From that is 0.020ms

于 2020-05-25T07:01:48.103 に答える
-3

動的に入力するすべての配列に対して行うのと同じ方法です。for ループ。スェードコードは

arr =array()
for(i; i<max; i++){
 arr[]=i

}

それは途中であなたを助けるはずです

于 2012-05-04T15:44:18.330 に答える