我有一个函数,它包含一些嵌套for循环并按预期工作。JavaScript嵌套循环使函数执行速度太慢
问题但是,它必须通过大量数据的循环,这意味着时间过久执行,往往同时执行冻结浏览器。
从服务器获取的数据大约为2000+个元素。
任何人都可以提出一个更有效的方式来编写这个函数,这将减少迭代的次数,并加快过程?
function markers(boxes) {
$.getJSON('empdata.json', function (data) {
var json = data;
for (var i = 0; i < boxes.length; i++) {
for(var v = 0; v < json.length; v++) {
//loop through parsed markers within bounds
var obj = json[v];
if (boxes[i].contains(new google.maps.LatLng(obj.latitude, obj.longitude))) {
var marker = new google.maps.Marker({
position: new google.maps.LatLng(obj.latitude, obj.longitude),
map: map,
});
} else {
console.log("out of box");
}
} //close bounds markers
} //close full loop parse
})
};
的功能的第一部分简单地获得关于从使用jQuery $.GetJSON
功能的静态JSON文件映射位置的数据。
第二部分根据给定的参数循环遍历已创建的边界框。最后,第三部分循环遍历JSON文件中的每个项目,并在给定边界内创建地图引脚。
我认为问题是可以循环很多框,并且这个乘以JSON文件中的2000多个项目意味着函数每次都必须经过数千次迭代。
如果问题的目标是获得优化/改进和现有的代码工作正常,你应该穿上[CodeReviews(HTTP问题://codereview.stackexchange。 COM /)。此外,对于代码冻结浏览器,你可以看看网络工作者,服务人员 – Rajesh
有数据结构可以帮助,但它是一个很大的话题。一种方法是将你的“盒子”分为象限,子象限和次象限等,这样你可以大大减少对象到盒子的比较次数。 – Pointy
尽管之前的评论是好的,应该考虑在我看来,这里的一个非常重要的一点也是从浏览器中拿走计算负载,即使用异步调用来让迭代由后端完成,并且因此确保不会使前端过载。然后,您可以使用提供的回调函数计算的数据,并且不会有任何浏览器冻结。 (这当然不会增加计算/迭代速度,但恕我直言在这种情况下仍然是一个重要的事情)。 –