数组大小爆炸

时间:2012-04-03 14:28:44

标签: javascript jquery google-maps

我有一段代码片段可以创建一个数组clusterUniqueMarkers,用于存储数组clusterMarkers中的所有唯一对象。

问题: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);
}); 

1 个答案:

答案 0 :(得分:1)

你的逻辑错了。您正在遍历clusterMarkers中的所有元素,并执行此操作:

如果唯一列表为空,请将当前元素添加为唯一列表。

如果唯一列表不为空,则遍历唯一列表,如果当前元素与当前唯一元素不匹配,则将其添加为唯一元素。您要做的是说&#34;如果当前元素不等于任何唯一的,请将其添加为唯一的&#34;,此代码将实现:

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