javascript循环的性能问题

时间:2014-11-10 07:29:01

标签: javascript

我有以下代码段,循环遍历一个包含大约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中,浏览器只是停止执行。给出了停止脚本错误。 任何人都有更好的解决方案来替换循环或其他方式吗?

4 个答案:

答案 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条记录的循环。

谢谢大家。