私はAjaxのGoogleマップスクリプトに取り組んでおり、forループで動的変数名を作成する必要があります。
for (var i = 0; i < coords.length; ++i) {
var marker+i = "some stuff";
}
取得したいのは、marker0
、marker1
、marker2
などです。 marker+i
に何か問題があると思います
Firebugはこれを私に与えます:missing ; before statement
これには配列を使用します。
var markers = [];
for (var i = 0; i < coords.length; ++i) {
markers[i] = "some stuff";
}
これには、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のこの少し奇妙な機能はめったに使用されません(十分な理由があります)が、特定の状況では役立つ場合があります。
これを試して
window['marker'+i] = "some stuff";
反復変数名に関しては、 テンプレートリテラル を使用して動的変数を作成するのが好きです。すべてのトム、ディック、ハリーは配列スタイルを使用していますが、これは問題ありません。配列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] */
}
Eval()メソッドを使用して、動的変数を宣言できます。ただし、配列を使用する方が適切です。
for (var i = 0; i < coords.length; ++i) {
var str ="marker"+ i+" = undefined";
eval(str);
}