17

配置されたアイテムのタイプに応じてマップに割り当てられるさまざまなアイコンを使用して、データ駆動型の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++;
    } 

ただし、ご想像のとおり、これは機能しません。また、次のようにevalを使用してみました。

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でそれを行うことができますが、それはここではオプションではありません。

ありがとう!

4

5 に答える 5

33

それは本当に簡単です:object["variablename"] = whatever;

たとえば、オブジェクトを持つことができます:var Landmarks = {}そしてあなたはそのようにそれに追加することができます:そしてLandmarks["landmark" + i] = new google.maps.Icon();それをそのように渡すことができます。

これらの変数をグローバルにする必要がある場合(なぜそうするのですか?)、を使用してグローバルオブジェクトに直接アクセスできますwindow

于 2010-03-09T23:35:19.623 に答える
5

などの宣言されたオブジェクトを使用してこれを行う場合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...
于 2010-03-09T23:44:38.633 に答える
4

質問に直接答えるだけです(ただし、これは希望する解決策ではないことに注意してください。他の答えを確認してください。これはドキュメント用です!)、JavaScriptコンソールからのコピーアンドペーストは次のとおりです。

> window["myNamedVar"] = "Hello, World!";
> console.log(myNamedVar);
  "Hello, World!"
于 2010-03-09T23:55:06.290 に答える
3

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"
于 2010-03-09T23:36:04.817 に答える
1

それらの変数が本当に必要ですか?あなたはこれで行うことはできません:

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]);
}

結果は次のとおりです。{病院:アイコン、教会:アイコン、...}

ここで、iconは、「icon {type} .png」の形式の文字列である画像属性を持つGoogleマップアイコンです(例:iconhostpital.png、iconchurch.png)。

アイコンを使用するにはlandmarks.type、typeがtypeの配列内の名前の1つである場合に書き込みlandmarks.hospitalます。

画像名がアイコン+番号+.pngの形式であり、各タイプの番号が配列内のインデックスと同等である場合は、createIcon(i)のcreateIcon(type [i])呼び出しを置き換えます。

于 2012-11-24T06:34:39.697 に答える