2012-04-03 6 views
0

Ich habe ein Code-Snippet, das ein Array clusterUniqueMarkers erstellt, das alle eindeutigen Objekte im Array clusterMarkers speichert.Array-Größe explodiert

Problem: Mit Hilfe von console.log(clusterUniqueMarkers.length); kann ich sehen, dass die Größe des Arrays explodiert! Wenn der Code ausgeführt wird, schießt der Browser CPU & Speicherverbrauch hoch und stürzt ab. Was könnte das Problem verursacht haben?

JS-Code

// 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

Ihre Logik ist falsch. Sie durchlaufen alle Elemente in cluoderMarkers und sagen: Wenn die eindeutige Liste leer ist, fügen Sie das aktuelle Element als ein eindeutiges hinzu. Wenn die eindeutige Liste nicht leer ist, durchlaufen Sie die eindeutige Liste. Wenn das aktuelle Element nicht mit dem aktuellen eindeutigen Element übereinstimmt, fügen Sie es als eindeutiges Element hinzu. Was Sie tun möchten, ist zu sagen: "Wenn das aktuelle Element nicht ** irgendwelcher ** der einzigartigen Elemente entspricht, fügen Sie es als ein einzigartiges Element hinzu". –

+0

Warum machst du 'mc.getMarkers() [j]' wenn du 'mc.getMarkers()' bereits in 'clusterMarkers' gespeichert hast? 'clusterMarkers [j]' ist viel lesbarer, wenn man den Rest des Codes betrachtet. –

+0

"Wenn das aktuelle Element keinem der eindeutigen Elemente entspricht, füge es als ein eindeutiges hinzu" -> Sollte dies nicht geschehen, indem alle eindeutigen Elemente durchlaufen werden und geprüft wird, ob sie dem aktuellen Element entsprechen, was das ist hast du? Oder ich habe mich wirklich verwirrt. Ja, danke für den Hinweis auf das 'mc.getMarkers() [j]' Problem. – Nyxynyx

Antwort

1

Ihre Logik ist falsch. Sie durchlaufen alle Elemente in clusterMarkers und tun dies:

Wenn die eindeutige Liste leer ist, fügen Sie das aktuelle Element als ein eindeutiges hinzu.

Wenn die eindeutige Liste nicht leer ist, durchlaufen Sie die eindeutige Liste. Wenn das aktuelle Element nicht mit dem aktuellen eindeutigen Element übereinstimmt, fügen Sie es als eindeutiges Element hinzu. Was Sie wollen, ist zu tun, sagen „wenn das aktuelle Element nicht gleich jede der Einzigen, fügen Sie es als Einzigen“, die dieser Code erreichen:

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); 
} 
Verwandte Themen