使用Google Maps V3标记时,请确保将每个标记的名称存储在一个数组中,以便快速将所有标记一次从 map 中删除。但是由于某种原因,当我调用应该遍历整个数组的函数时,很长一段时间都删除了所有标记,该函数仅删除了一些标记后返回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"]
显然,数组成功运行直到它达到“undefined”值,然后停止。我该怎么办才能解决这个问题?
最佳答案
我很确定,在起始数组中没有任何未定义值的情况下,在迭代过程中获得未定义值的原因是要在遍历数组时从数组中删除项目。我想这会混淆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");
}
}
}
关于javascript - $ .each语句在达到 “undefined”值时停止,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8686059/