私はjavascriptオブジェクトを持っていますvar flower_1; var flower_2;
私の質問は、文字列などの別の変数があるかどうかですvar Name;
そして、例えば:Name = "flower_1";
Name
変数をオブジェクトに変更するにはどうすればよいですか"flower_1"
私はjavascriptオブジェクトを持っていますvar flower_1; var flower_2;
私の質問は、文字列などの別の変数があるかどうかですvar Name;
そして、例えば:Name = "flower_1";
Name
変数をオブジェクトに変更するにはどうすればよいですか"flower_1"
私があなたの質問を正しく理解しているなら、あなたはこのようなものを持っています:
function foo() {
var flower_1 = { /* ... */ };
var flower_2 = { /* ... */ };
var name = "flower_1";
var target = /* code here to get the correct object based on `name` */;
}
あなたはそれを行うことができますが、可能な限り避けるべきです:
var target = eval(name);
eval
は非常に大きく、悪用されやすいツールであり、回避する必要があり、回避することができます。数年間のJavaScript開発で、本番コードで使用する必要はありませんでした。また、言語の新しい「strict」モードeval
では許可されていないことに注意してください(strictモードがもたらす多くの改善の1つ)。
この特定のケースでは、回避するのは非常に簡単です。
function foo() {
var objects = {
flower_1: { /* ... */ },
flower_2: { /* ... */ }
};
var name = "flower_1";
var target = objects[name];
}
現在、flower_1
およびflower_2
はオブジェクトのプロパティ[]
であり、文字列名とともに括弧で囲まれた表記()を使用して、これらのプロパティにアクセスできます。これは、JavaScriptオブジェクトでは、ドット付き表記とリテラル(eg、obj.foo
)を使用するか、括弧付き表記と文字列(eg、obj["foo"]
)を使用してプロパティにアクセスできるためです。2番目のケースでは、文字列は文字列リテラルである必要はありません。これは、(この場合のように)変数から文字列を取得することを含む式の結果である可能性があります。
ステートメントがグローバルの場合var
、それらの変数はグローバルオブジェクトのプロパティになります。これはWebブラウザーではですwindow
。したがって、グローバルの場合window[name]
は、まったく同じ理由でそれらにアクセスできますobjects[name]
。ただし、グローバル変数を回避することをお勧めします(可能な場合は完全に、または必要に応じてすべての公開変数を含む適切な一意の名前を持つ変数を1つだけ公開します。たとえば、外部コードが変数にアクセスする必要がある場合)。
eval()
次の関数を使用できます。
var flower_1 = "abc";
var name = "flower_1";
var x = eval(name); // = "abc"
ただし、eval()
関数の使用はベスト プラクティスではなく、絶対に避けるべきであることに注意してください。
連想配列を使用することをお勧めします。
var name = "flower_1";
var arr = new Array();
arr["flower_1"] = "abc";
var x = arr[name]; // = "abc"