繁体   English   中英

遍历装有Google Maps标记对象的多维Javascript数组

[英]Iterating through a multidimensional Javascript array filled with Google Maps markers objects

我将所有Google Maps标记对象存储在一个数组中。 现在,我正在尝试设置一个函数,该函数将从地图中删除数组中的所有标记,但是循环遇到了麻烦。

首先,我将每个标记放入数组中,如下所示:

eval("markerZip"+value.zip+" = new google.maps.Marker({map: map, icon: '/images/mapmarker.php?m=zip_marker.png', position: zipCenter});");
eval("markersArray['markerZip"+value.zip+"'] =  markerZip"+value.zip);

然后,当我要删除标记时,请执行以下操作:

function removeAllMarkers(exceptId) {
    $.each(markersArray, function(index, value) {
        if(value != exceptId) {
            value.setMap(null);
            console.log(value);
        }
    });
}

但是,遍历数组似乎没有任何作用。 好像数组是空的,因为console.log行什么都不返回。 当我在控制台中显示数组时,它显示“ []”(然后单击以显示子对象),其中包含:

markerZip01002
    U { gm_accessors_={...}, map=U, b=U, more...}

markerZip02111
    U { gm_accessors_={...}, map=U, b=U, more...}

markerZip02135
    U { gm_accessors_={...}, map=U, b=U, more...}

markerZip02139
    U { gm_accessors_={...}, map=U, b=U, more...}

markerZip02466
    U { gm_accessors_={...}, map=U, b=U, more...}

问题是您将数组用作哈希或字典。 jQuery检查是否已传递的对象具有length属性-有关实现, 请参见此处 由于您要传递数组,因此会迭代数组中的值,可以通过0到obj.length - 1之间的整数键来访问该值。 由于数组中没有可以通过这种方式访问​​的值,因此循环立即终止。

您将markersArray当作JavaScript对象而不是数组来对待-因此,最好对markersArray对象使用{}而不是[]

<rant>另外,永远不需要使用eval来设置哈希中的键。 它效率低下-您需要为每次调用eval启动新版本的JavaScript运行时。 它很脆弱-您正在编写包含代码的字符串并在其中注入其他字符串- 数据中的 "//放错位置可能会使程序停止运行。最后,它需要持续使用全局范围-每当出现这种情况时都应避免使用您不拥有全局范围。 </rant>

您可以替换这两行:

eval("markerZip"+value.zip+" = new google.maps.Marker({map: map/*etc.*/});");
eval("markersArray['markerZip"+value.zip+"'] =  markerZip"+value.zip);

与这一行:

// Assume we did this earlier
// var markersHash = {};
markersHash["markerZip"+value.zip] = new google.maps.Marker({map: map /*etc.*/});

当您这样做时,您对$.each的调用$.each预期工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM