【问题标题】:Performance issue with javascript loopjavascript循环的性能问题
【发布时间】:2014-11-10 07:29:00
【问题描述】:

我有以下代码 sn-p,循环遍历一个包含大约 5000 个谷歌标记的对象。我正在更改循环中标记的可见性。

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 中,浏览器只是停止执行。给出停止脚本错误。 任何人都有更好的解决方案来替换循环或其他方式?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    最好使用 Break 并继续使循环更短。您可以尝试here 解决方案。

    【讨论】:

      【解决方案2】:

      我在这里看到的主要问题是您在循环中调用的 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?

      【讨论】:

        【解决方案3】:

        一些可以加快速度的小变化是对经常访问的对象使用变量,例如

        var currentLevel = obj.all_level_markers[lvl]; 
        var currentLevelItem = currentLevel[i];
        

        您还可以在 for 循环中使用长度缓存,即

        for(var i = 0, len = currentLevel.length; i < len; i++)
        

        【讨论】:

          【解决方案4】:

          我通过将 for 循环分成块解决了这个问题。 更换

          for (var i=0; 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 条记录的循环。

          谢谢大家。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-09-06
            • 1970-01-01
            • 2014-05-18
            • 2016-01-04
            相关资源
            最近更新 更多