web-dev-qa-db-ja.com

ループ内で動的変数名を作成するにはどうすればよいですか?

私はAjaxのGoogleマップスクリプトに取り組んでおり、forループで動的変数名を作成する必要があります。

for (var i = 0; i < coords.length; ++i) {
    var marker+i = "some stuff";
}

取得したいのは、marker0marker1marker2などです。 marker+iに何か問題があると思います

Firebugはこれを私に与えます:missing ; before statement

47

これには配列を使用します。

var markers = [];
for (var i = 0; i < coords.length; ++i) {
    markers[i] = "some stuff";
}
93
JohnP

これには、Arrayを使用するのが一般的に望ましいことに同意します。

ただし、JavaScriptで現在のスコープにプロパティを追加するだけでこれを実現することもできます(トップレベルコードの場合、グローバルスコープ、関数内の場合関数スコープ )単にthisを使用することにより、常に現在のスコープを参照します。

for (var i = 0; i < coords.length; ++i) {
    this["marker"+i] = "some stuff";
}

後で保存された値を取得できます(設定されたときと同じスコープ内にいる場合)。

var foo = this.marker0;
console.log(foo); // "some stuff"

JavaScriptのこの少し奇妙な機能はめったに使用されません(十分な理由があります)が、特定の状況では役立つ場合があります。

45

これを試して

window['marker'+i] = "some stuff"; 
14
Safiq

反復変数名に関しては、 テンプレートリテラル を使用して動的変数を作成するのが好きです。すべてのトム、ディック、ハリーは配列スタイルを使用していますが、これは問題ありません。配列andの動的変数を使用するまでは、ああ!アイブリードの過負荷。テンプレートリテラルのサポートは現在制限されているため、 eval() は別のオプションです。

v0 = "Variable Naught";
v1 = "Variable One";

for(i = 0; i < 2; i++)
{//console.log(i) equivalent is console.log(`${i}`)
  dyV = eval(`v${i}`);
  console.log(`v${i}`); /* => v0;   v1;  */      
  console.log(dyV);  /* => Variable Naught; Variable One;  */
}

APIをハックしていたとき、この小さなループスニペットを作成して、Rubyと比較してテンプレートリテラルで行われた動作に応じた動作を確認しました。私はRubyの動作がより好きでした。値を取得するためにeval()を使用する必要があるのは、自動的に値を取得することに慣れているときの一種の不自由です。

_0 = "My first variable"; //Primitive
_1 = {"key_0":"value_0"}; //Object
_2 = [{"key":"value"}]    //Array of Object(s)


for (i = 0; i < 3; i++)
{
  console.log(`_${i}`);           /*  var
                                   * =>   _0  _1  _2  */

  console.log(`"_${i}"`);         /*  var name in string  
                                   * => "_0"  "_1"  "_2"  */

  console.log(`_${i}` + `_${i}`); /*  concat var with var
                                   * => _0_0  _1_1  _2_2  */

  console.log(eval(`_${i}`));     /*  eval(var)
                                   * => My first variable
                                        Object {key_0: "value_0"}
                                        [Object]  */
}
4

Eval()メソッドを使用して、動的変数を宣言できます。ただし、配列を使用する方が適切です。

for (var i = 0; i < coords.length; ++i) {
    var str ="marker"+ i+" = undefined";
    eval(str);
}
3
Md Junaid Alam