我有以下代码段,循环遍历一个包含大约5000个Google标记的对象。我正在改变循环中标记的可见性。
var no_of_levels = 4;
for (j=1; j <= no_of_levels ; j++){
if (j == lvl_no){
var lvl = 'level'+lvl_no;
var visible_level_markers = new Array();
if (lvl_no == 4){
visible_level_markers = search_flag ? search_visible_markers['region']: map_sel_regions;
}else if (lvl_no == 3){
visible_level_markers = search_flag ? search_visible_markers['sub']: map_sel_subregions;
}else if (lvl_no == 2){
visible_level_markers = search_flag ? search_visible_markers['switches']: map_sel_switches;
}
if (obj.all_level_markers[lvl] != null || obj.all_level_markers[lvl] != undefined){
for (var i=0; i < obj.all_level_markers[lvl].length ; i++){
if (!obj.all_level_markers[lvl][i].getVisible()){
var marker_name = obj.all_level_markers[lvl][i].customInfo.split(" : ")[1];
if (lvl_no != 1 && $.inArray(marker_name, visible_level_markers) < 0) {continue;}
obj.all_level_markers[lvl][i].setVisible(true);
}
}
}
}
else{
var lvl = 'level'+j;
if (obj.all_level_markers[lvl] != null || obj.all_level_markers[lvl] != undefined){
for (var i=0; i < obj.all_level_markers[lvl].length ; i++){
if (obj.all_level_markers[lvl][i].getVisible()){
obj.all_level_markers[lvl][i].setVisible(false);
}
}
}
}
}
在IE8中,浏览器只是停止执行。给出了停止脚本错误。 任何人都有更好的解决方案来替换循环或其他方式吗?
答案 0 :(得分:0)
更好地使用Break并继续缩短循环位。您可以尝试使用here解决方案。
答案 1 :(得分:0)
我在这里看到的主要问题是你在循环中调用的getVisible / setVisible。
找到一些更简单的获取/设置可见性的方法。
以下帖子对此进行了讨论。 Google Maps V3: Check if marker is present on map? How to find all the the markers which are currently visible on Google Maps V3?
答案 2 :(得分:0)
可以加快这一点的一些微小变化是对经常被访问的对象使用变量,例如
var currentLevel = obj.all_level_markers[lvl];
var currentLevelItem = currentLevel[i];
您还可以在for
循环中使用长度缓存,即
for(var i = 0, len = currentLevel.length; i < len; i++)
答案 3 :(得分:0)
我通过将for循环分成块来解决了这个问题。 替换
for(var i = 0; i&lt; obj.all_level_markers [lvl] .length; i ++){
带
chunk(visible_level_markers.concat(),1000,true);
function chunk(array, count, action){
if(array != null && typeof(array) != 'undefined'){
while(count){
var item = array.shift();
if(global_all_markers[item] != null && typeof(global_all_markers[item]) != 'undefined') {
global_all_markers[item].setVisible(action);
}
count--;
if (array.length > 0 && count == 0 ){
setTimeout(chunk, 100, array, 1000, action);
}
}
}
}
这样浏览器一次只能处理1000条记录的循环。
谢谢大家。