我有一段代码片段可以创建一个数组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);
});
答案 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);
}