2

私は Google マップで作業しており、3 つ以上のタイル オーバーレイを作成する必要があります。例:

タイルオーバーレイ

var parkingOptions = {                     //Parking Overlay
    getTileUrl: function(coord, zoom) {
        return "/maps/tiles/tilesparking/" + zoom + "_" + coord.x + "_" + coord.y + ".png";
    },
    tileSize: new google.maps.Size(256, 256)
};

var parkingMapType = new google.maps.ImageMapType(parkingOptions);

ただし、マッピング範囲外のタイルが見つからないことによる 404 エラーを回避するために、私のコードはもう少し複雑です。したがって、各オーバーレイに割り当てられた特定のキーワード(ここでは「駐車場」として指定)が上記のコードに挿入されるループを作成するつもりでした。したがって:

ループの場合

var tileNames = ["base", "parking", "access"];

for (var i = 0; i < tileNames.length; i++) {
    //insert Tile Overlay code here
};

ただし、特定の問題が 1 つあります。tileNames 配列から文字列を取得し、それらをタイル オーバーレイ コードの 2 つの変数の初期化に使用する方法が見つかりません。理想的には、次のようなことを達成したいと考えています。

試行 1

var tileNames[1] + "Options" = {  //ideally: var parkingOptions = {
    //insert remaining code
};

しかし、これは機能しません。また、私は本当に期待していませんでした。これらの完全な文字列を作成して初期化に挿入しようとすることもありません。

試行 2

var newOptions = tileNames[1] + "Options";
var newOptions = {
    //insert remaining code
};

したがって、文字列を初期化変数に配置する方法はありますか?


注:回答として、問題に対する独自の代替ソリューションを含めました。動作するはずですが、変数の名前を破棄し、説明のない配列変数に置き換えます。結果のコードでオーバーレイを追加および非表示にする際に頻繁に使用されるため、説明的な変数名を保持したいと思います。


とにかく この質問について...

var tileNames = ["beloit", "parking", "access"];
var mapType = {};

for (var i = 0; i < tileNames.length; i++) {
    var tileOptions = {
        getTileUrl: function(coord, zoom) {
            return "/maps/tiles/tiles" + tileNames[i] + "/" + zoom + "_" + coord.x + "_" + coord.y + ".png";
        },
        tileSize: new google.maps.Size(256, 256)
    };
    mapType[tileNames[i]] = new google.maps.ImageMapType(tileOptions);
};

パズルの他の部分である getTileUrl 関数の「tileNames[i]」は未定義です。これは、名前文字列を関数に配置するのではなく、実行時に関数が必要とするためです。ただし、それはここで見つかる新しい質問です: Javascript: Making a variable static when defined a function in a loop?

4

4 に答える 4

1

さて、上記が実際に可能かどうかはわかりませんが(以下で説明するように、可能であることが多少望ましいと思います)、この質問の草案を作成する際に、事前に読んだ他のさまざまなQ / AIがより意味をなすようになりました. 彼らの一般的なメッセージ:「配列を使用してください」:

考えられる解決策 (編集済み; 今すぐ使用できるはずです。)

var tileNames = ["beloit", "parking", "access"];  //Would be used more than once.
var tileMapType = [];

for (var i = 0; i < tileNames.length; i++) {
    var tileOptions = {
        getTileUrl: function(coord, zoom) {
            return "/maps/tiles/tiles"+tileNames[i]+"/" + zoom + "_" + coord.x + "_" + coord.y + ".png";
        },
        tileSize: new google.maps.Size(256, 256)
    };
    tileMapType[i] = new google.maps.ImageMapType(tileOptions);
};

このアプローチの唯一の問題は、次のコードで、これらの MapTypes をマップに配置し、表示と非表示を切り替える必要があることです。これを行うためにわかりやすい tileMapType[x] を使用すると、全体的な読みやすさが妨げられます。 (おそらく、これは私が思っているほど重要ではありませんが、それでも. >.>)

于 2012-06-26T16:35:05.800 に答える
1

あなたはこれを行うことはできません:

var tileNames[1] + "Options" = {
  //insert remaining code
};

しかし、あなたはこれを行うことができます:

window['a'] = 'b';
alert(a); // shows 'b'

または、関数にいる場合

this['a'] = 'b';

編集:

var obj = {};
obj.a = 'a';
// obj.a == obj['a']
alert(obj['a']) // alerts a
于 2012-06-26T16:38:33.460 に答える
1

あなたの質問を理解したと仮定すると、タイルをオブジェクトにカプセル化し、指定した名前でレイヤーを参照できます。

var tileNames = ["base", "parking", "access"];
var Tiles = {};

for (var i = 0; i < tileNames.length; i++) {
    Tiles[tileNames[i]] = makeOverlay(tileNames[i], coords, zoom);
};

//iterate the maps
for (var tile in Tiles)
   alert(Tiles[tile].someGoogleMapPropery)

//individually     
alert (Tiles.base.someGoogleMapPropery)
alert (Tiles.parking.someGoogleMapPropery)
//or
alert (Tiles["access"].someGoogleMapPropery)


function makeOverlay(name, coords, zoom) {
    return new google.maps.ImageMapType({
            getTileUrl: function(coord, zoom) {
                return "/maps/tiles/tiles" + name + "/" + zoom + "_" + coord.x + "_" + coord.y + ".png";
            },
            tileSize: new google.maps.Size(256, 256)
        });
}​
于 2012-06-26T17:05:04.593 に答える
0

eval() を使用してそのような変数を読み取ることはできますが、設定することはできません。

例:

var a = "b"; var b = "c"; 評価 (a); // "c" を返す

于 2012-06-26T16:42:40.013 に答える