あ容易に作成するための方法ダイナミックな変数Javascript?
-
18-09-2019 - |
質問
私は内蔵のデータ駆動型のgoogleマップのアイコンからの地図の種類によって項目にあります。うにしている場合は5種類のランドマーク、各々が異なるアイコン(店舗、図書館、病院等)-- 何を思い出して、googleアイコンオブジェます。思うようになります:
types = array('hospital','church','library','store',etc);
var i=0;
while (i<=types.length) {
var landmark + i = new google.maps.Icon();
landmark.image = "icon" + i + ".png";
i++;
}
しかし、ゲームとしては初めての推測され、これは当てはまりません。もって、<エバール>のようになります:
while (i<=types.length) {
doIcon(i);
i++;
}
function doIcon(i){
eval("var landmark" + i + " = new.google.maps.Icon();");
return eval("landmark" + i);
}
んのいずれか--私を担当するポインタの作成をjavascriptの変数ます。なってきて純js,しかできなかったんでPHPでも、それだけではありませんがオプションです。
よろしく!
解決
できにくい: object["variablename"] = whatever;
したがって、たとえば、使ってオブジェクト: var Landmarks = {}
として追加できるのではこのように: Landmarks["landmark" + i] = new google.maps.Icon();
っていることができてうれしいです。
が必要な場合はこれらの変数を グローバル (なぜですか?) アクセスでき、グローバルオブジェクトを直接使用 window
.
他のヒント
Landmark["landmark" + i]
として宣言されたオブジェクトを使用して、それをやろうとしている場合は、、あなたは本当にだけでなく、それは繰り返しのためにはるかに簡単だ、連想ではなく、インデックス配列を使用することができます。配列はそれをはるかに良い仕事をするためのオブジェクトが実際にインデックス付きプロパティで使用されていません。
var myObj = // object version
{
"item0": "blah",
"item1": "blah"
// etc
}
var myArr = // array version
[
"blah",
"blah"
// etc
]
はるかに賢明な配列を使用するには:
landmarks = []; // new array
types = array('hospital','church','library','store',etc);
var i=0;
while (i<=types.length) {
landmarks.push(new google.maps.Icon());
landmarks[i].image = "icon" + i + ".png";
i++;
}
これは、そのように行うために、より理にかなっているとfor...in
は、試作したプロパティは、列挙された状態で少し厄介取得することができ、オブジェクトの上にループなど。
あなたは変数グローバルを作成しようとしている場合、ウィンドウオブジェクトに追加します:
var myCustomVar = "landmark" + i;
window[myCustomVar] = new google.maps.Icon();
alert(landmark0);
しかし、これは多くの不要な変数とグローバルな名前空間を汚染することになります。だから、あなたはまだ配列を持つ方が良いと思います:
window.landmarks = [];
landmarks.push(new google.maps.Icon());
// etc...
ただ今のご質問を直接にはご注意ください この解決にはならないます。チェックのその他の応答となります。これは単なドキュメンタリー!)、コピー-ペーストからのJavaScriptコンソール:
> window["myNamedVar"] = "Hello, World!";
> console.log(myNamedVar);
"Hello, World!"
あなたは、PHPで使用される連想配列のようにやや使用できるjavascriptオブジェクトを作成したほうが良いと思います:
var types = ['hospital','church','library','store'];
var landmarks= {};
for (var i in types) {
landmarks[types[i]]= new google.maps.Icon();
landmarks[types[i]].image = "icon" + i + ".png";
}
alert(landmarks['hospital'].image); // displays "icon0.png"
あなたは本当にこれらの変数が必要ですか?あなたがこれを行うことはできません。
var types = ['hospital','church','library','store'];
for(var i =0; i < types.length; i += 1) (new google.maps.Icon()).image = "icon" + i + ".png";
コメントに基づいて行われ、変更:
+タイプ+の.pngをアイコンに+の.pngアイコン+指標から変化アイコン名パターン ループの結果を保存します。
types = ['hospital','church','library','store'];
var landmarks = {};
// images names are of the form icon + type + .png
function createIcon(type)
{
var icon = new google.maps.Icon();
icon.image = "icon" + type + ".png";
return icon;
}
// mapping of landamarks by type and icon
for (var i = 0, len = types.length; i < len; i++)
{
landmarks[types[i]] = createIcon(types[i]);
}
結果は次のとおりです。 { 病院:アイコン、 教会:アイコン、 ... }
ここで、アイコンである形式の文字列である画像属性を持つGoogleマップアイコン「アイコン{タイプ} .PNG」、例えば、iconhostpital.png、iconchurch.png。
例えば、型は型の配列内の1つの名前であるlandmarks.type
を書き込みアイコンを使用するにlandmarks.hospital
ます。
画像名は、フォームアイコン+番号+ .PNGのものであり、各タイプの数がcreateIcon(I)のコールcreateIcon(タイプ[I])を置き換える配列内のインデックスと等しい場合。