2012-04-03 9 views
0

配列にすべての一意のオブジェクトを格納する配列clusterUniqueMarkersを作成するコードスニペットがあります。配列サイズが爆発する

問題:console.log(clusterUniqueMarkers.length);の助けを借りて、その配列のサイズが爆発するのがわかります!コードが実行されると、ブラウザのCPU &メモリ使用量が増加し、クラッシュします。何が問題を引き起こしたのでしょうか?

JSコード

// MarkerClusterer click handler 
google.maps.event.addListenerOnce(mc, "clusterclick", function (cluster) { 

    // Find number of unique LatLng in clusters 
    var clusterMarkers = mc.getMarkers(); 
    var clusterUniqueMarkers = []; 
    for(var j = 0; j < clusterMarkers.length; j++) { 

     if(clusterUniqueMarkers.length == 0){ 
      // Adding first unique marker 
      clusterUniqueMarker = new Object(); 
      clusterUniqueMarker.lat = mc.getMarkers()[j].position.lat(); 
      clusterUniqueMarker.lng = mc.getMarkers()[j].position.lng(); 
      clusterUniqueMarkers.push(clusterUniqueMarker); 
     } else { 
      // At least 1 unique marker 
      var clusterUniqueMarkersLength = clusterUniqueMarkers.length; // prevent infinite loop when clusterUniqueMarkers.length keeps increasing 
      console.log(clusterUniqueMarkers.length); 
      console.log(clusterUniqueMarkersLength); 
      console.log('j: ' + j); 
      for(var k = 0; k < clusterUniqueMarkersLength; k++) { 
       // If marker is unique 
       if(clusterUniqueMarkers[k].lat != mc.getMarkers()[j].position.lat() && clusterUniqueMarkers[k].lng != mc.getMarkers()[j].position.lat()) { 
        clusterUniqueMarker = new Object(); 
        clusterUniqueMarker.lat = mc.getMarkers()[j].position.lat(); 
        clusterUniqueMarker.lng = mc.getMarkers()[j].position.lng(); 
        clusterUniqueMarkers.push(clusterUniqueMarker); 
       } 
      } 
     } 

    } 
    console.log(clusterMarkers); 
    console.log(clusterUniqueMarkers); 
}); 
+0

あなたのロジックが間違っている:何がしたいことは、「現在の要素がユニークなものの任意の等しくない場合は、独自の一つとして、それを追加します」と言うこのコードは達成する、です。あなたはcluserMarkersのすべての要素を繰り返して、次のように言っています。一意のリストが空の場合は、現在の要素を一意のものとして追加します。一意のリストが空でない場合は、一意のリストを反復処理し、現在の要素が現在の一意の要素と一致しない場合は、一意のリストとして追加します。あなたがしたいことは、「現在の要素が、**ユニークな要素のいずれか**と等しくない場合は、それをユニークな要素として追加する」と言うことです。 –

+0

また、 'mc.getMarkers()'を 'clusterMarkers'にすでに保存しているときに' mc.getMarkers()[j] 'をやっているのはなぜですか? 'clusterMarkers [j]'は、コードの残りの部分を見ると、はるかに読みやすくなります。 –

+0

"現在の要素が一意のものと等しくない場合は、それを一意のものとして追加します" - >これは、すべての一意の要素を反復処理して、現在の要素した?あるいは、私は本当に混乱しているかもしれません。 'mc.getMarkers()[j]'問題を指摘してくれてありがとう。 – Nyxynyx

答えて

1

あなたの論理は間違っています。

一意のリストが空の場合は、現在の要素を一意のものとして追加します。

一意のリストが空でない場合は、一意のリストを繰り返し、現在の要素が現在の一意要素と一致しない場合は、一意の要素として追加します。

for(var k = 0; k < clusterUniqueMarkersLength; k++) { 
    // If marker is unique 
    var unique = true; 
    if(clusterUniqueMarkers[k].lat == clusterMarkers[j].position.lat() && clusterUniqueMarkers[k].lng == clusterMarkers[j].position.lat()) { 
     // if the element in clusterMarkers is equal to an element already in clusterUniqueMarkers 
     // it can't be unique 
     unique = false; 
    } 
} 
if(unique) { 
    clusterUniqueMarker = new Object(); 
    clusterUniqueMarker.lat = mc.getMarkers()[j].position.lat(); 
    clusterUniqueMarker.lng = mc.getMarkers()[j].position.lng(); 
    clusterUniqueMarkers.push(clusterUniqueMarker); 
} 
関連する問題