2

在与谷歌地图V3标志的工作,我一定要每个标记的名称存储在数组中,所以我可以很快地从地图上立即将它们全部删除。不过由于某种原因,当我调用我的函数时,应该遍历整个数组,在删除所有标记的过程中,函数仅在删除一些标记后返回undefined。

函数之前的阵列(markersArray):

["markerZip02111", "markerZip02139", "markerZip01002", "markerZip94602", "markerZip02460"] 

功能码:

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

什么控制台显示:

markerZip02111 
markerZip01002 
markerZip02460 
undefined 

功能之后的阵列运行:

["markerZip94602", "markerZip02460"] 

显然,直至碰到“未定义”值,然后将其停止阵列成功运行。我能做些什么来解决这个问题?

+3

你可以很容易地避免'的eval()'如果你在一个对象设置每个'markerZipxxxxx'项目,而不是让他们的变量。如果它们是全局变量,那么您可以执行'window [value] && window [value] .setMap(null);' – 2011-12-31 03:28:45

+1

在遍历数组时,“拼接”数组似乎不明智。你究竟想要完成什么? – Domenic 2011-12-31 03:29:46

+0

我不是我:他们是全局变量,我不确定你的意思是窗口[价值]。 – Colin 2011-12-31 04:11:33

回答

3

我敢肯定迭代时,你的出发阵列没有任何不确定的值时你得到一个未定义值的原因,那就是你从数组删除项目,同时通过它迭代。我想这会混淆jQuery $.each()迭代器。

如果你看看你的输出,正在发生的事情是这样的:

1st Iteration 
    index === 0, array is["markerZip02111", "markerZip02139", "markerZip01002", 
          "markerZip94602", "markerZip02460"] 
    item 0 "markerZip02111" gets removed, shifting all the later elements up 
2nd Iteration 
    index === 1, but now array is ["markerZip02139", "markerZip01002", 
            "markerZip94602", "markerZip02460"] 
    item 1 "markerZip01002" gets removed, shifting all the later elements up 
3rd Iteration 
    index ===2, but now array is ["markerZip01002", "markerZip94602", 
            "markerZip02460"] 
    so the last item "markerZip02460" gets removed 
4th Iteration 
    index === 3, but now array only has two elements so value 
    at that index is undefined. 

注意两个项目从来没有得到评估:迭代器跳过它们,因为你通过删除项目改变了他们的索引。

如果你去很容易与传统的for循环遍历倒退,使得移除项目不会搞砸循环计数器必须删除的项目。 (或者,只要每次移除物品时调整计数器变量,就可以使用常规的for循环前进。)

另外,当您进行拼接时,您需要传递物品的索引作为第一个参数,而不是项目的值。所以markersArray.splice(index, 1);不是markersArray.splice(value, 1);

所以,像这样:

function removeAllMarkers(exceptId) { 
    var value; 
    for (var i = markersArray.length - 1; i >= 0; i--) { 
     value = markersArray[i]; 
     if (value != exceptId) { 
     markersArray.splice(i, 1); 
     eval(value+".setMap(null);"); 
     console.log(value + " removed"); 
     } 
    } 
} 
+0

谢谢!这是一个写得很好的解释。我完全明白现在出了什么问题!谢谢!我在使用Google地图时遇到问题,现在不能删除标记,但它与循环停止无关。 – Colin 2011-12-31 04:34:25

1
$.each(markersArray, function (index, value) {    
      if (value != null && value != undefined && value!= exceptId) { 
       eval(value + ".setMap(null);"); 
       markersArray.splice(value, 1); 
       console.log(value); 
      } 
     }); 
+0

当我添加!= undefined值时,循环在达到未定义值时仍然停止。 – Colin 2011-12-31 03:42:26

+0

我刚更新。 – dotnetstep 2011-12-31 05:10:09

2

我觉得dotnetstep钉,但你也可以尝试包裹$.each用一个try/catch内部的逻辑更广泛的处理:

http://www.w3schools.com/js/js_try_catch.asp

祝你好运!

+0

问题是没有错误正在传递。问题在于当“undefined”通过时,循环停止。 – Colin 2011-12-31 04:09:36

+0

@ Colin-一个try/catch循环防止程序在遇到错误时停止(除非你明确地告诉它停止在“catch”部分)。 ;) – 2011-12-31 18:39:41