向全局对象添加属性

5

我知道这是一个常见问题,我是一个JS新手,但即使在StackOverflow上搜索了几个小时后,我仍然完全被卡住了。

我正在使用谷歌地图API,并希望通过与ID关联来跟踪我的标记。所以我有全局变量var pinArray = new Object(),并像这样添加标记:

function CreateMarkers (data){              
        data.forEach(function(store) {          
            <!-- CREATE MAP MARKER -->
            var mapLat = store.latitude;
            var mapLong = store.longitude;
            var mapLatLng = { lat: parseFloat(mapLat), lng: parseFloat(mapLong) };                      
            var marker = new google.maps.Marker({
                position: mapLatLng,
                title: store.name,          
                icon: {
                    path: google.maps.SymbolPath.CIRCLE,
                    scale: 8.5,
                    fillColor: 'Green',
                    fillOpacity: 0.8,
                    strokeWeight: 0.6,
                },              
                zIndex: 0   
            });
            cluster.addMarker(marker);
            var key = store.Id;
            pinArray['${key}'] = marker;                        
        })
    }   

clustervar cluster = new MarkerClusterer(map);

当我尝试在函数外部使用 console.log(pinArray); 时,我得到一个空对象:Object {}。我也尝试不使用字符串插值,如 pinArray[store.Id] = marker;,但是遇到了同样的问题。

我需要保持标记和 ID 之间的全局关联,因为在其他函数中我需要按照它们的 ID 引用和更新标记。或者至少,我认为我需要这样做,我也愿意采用其他方法。非常感谢您的帮助;提前致谢。


1
仅供参考 - <!-- CREATE MAP MARKER --> 是 HTML 中的注释语法 - JavaScript 的注释是 //像这样 - tymeJV
@tymeJV 哦,谢谢。我本来想回去改的。 - Mason
2个回答

2

通常在以前,我会使用标准的javascript数组而不是ID化对象来处理类似的事情:

var pinArray = [];

然后,随着操作的进行,使用push将标记添加到其中:
pinArray.push(Marker);

当您创建PIN时,可以在其属性定义中包含您的密钥:
var marker = new google.maps.Marker({
            position: mapLatLng,
            title: store.name,          
            icon: {
                path: google.maps.SymbolPath.CIRCLE,
                scale: 8.5,
                fillColor: 'Green',
                fillOpacity: 0.8,
                strokeWeight: 0.6,
            },              
            zIndex: 0,
            key: store.Id
        });

如果您需要按ID查找单个地图标记,则可以编写一个简单的循环查找函数。类似如下:

function GetMarkerByKey(key) {
    var i = 0;
    while (pinArray[i].key != key) {i++}
    return pinArray[i];
}

此外,如果您在单击或悬停的动态事件处理程序中使用它,您可以使用this属性来确定他们正在使用哪个标记激活它。
~~~编辑以修复语法错误~~~

这是一个好主意,我不知道我可以随意添加地图标记的任何属性。我还习惯于强类型的.NET! - Mason
顺便提一下,key = store.Id 应该是 key: store.Id - Mason
啊,我也是一个.NET开发人员 :) 我知道你的意思。JavaScript是一个完全不同的世界,但是过一段时间后你会习惯的。抱歉我的脚本不完美,我并没有真正尝试在浏览器中运行它,我只是直接在Stack Overflow答案框中写入了它哈哈。如果那个查找函数立即起作用,我会相当惊讶的。 - Jrud
查找功能真的很好用!这个解决方案非常有效。现在我只是想提高一些效率。我有10k+标记,聚类可以加快加载速度,但我正在尝试学习动态视口,以便在任何给定点上只加载我需要的地图。 - Mason
啊,有趣。我以前没有使用过视口,我相信它很有趣。祝你提高效率! - Jrud

2

var pinArray 将变量分配在其定义的函数范围内。无论您在函数内部的任何位置,确保将变量定义为全局的最安全的方法是将其分配给 window

Translated text:

var pinArray 分配的变量在其定义的函数作用域内。确保您将变量定义为全局变量的最安全方法是将其分配给 window,无论您在函数内的位置如何。

window.pinArray = new Object();

我不知道那是否是他的问题,但那是一个相当不错的技巧。+1 - Jrud
谢谢你的建议!我想我会使用下面列出的标准数组方法,但这对于真正的全局变量来说是很好的知识。谢谢! - Mason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接