我一直在使用javascript运行一些使用leaflet.js库的简单代码(在这种情况下,特定的功能是mymap.layerPointToLatLng(),here is the documentation)。
我想使用[[[[x,y]],[[x,y]],...]形式的数据(该格式特别适用于leaflet.js如何处理多边形和多面体,这种格式是我称之为“ dim = 2”)。我需要将其转换为纬度和经度(因此,前面提到的函数)。因为我经常这样做,所以我写了一个函数为我做这件事:
/*-Formatting functions*/
function coordconvert(mapvar,array,dim){
var temp1in=[],tempout1=[],temp2out=[];
if(dim===1){
for(i=0;i<array.length;i++){
tempout1[i]=mapvar.layerPointToLatLng(array[i]);
}
return tempout1;
}
else if(dim===2){
for(i=0;i<array.length;i++){
temp1in=array[i];//each polygon
console.log(i);
console.log(temp1in);
console.log(tempout1);
//tempout1=[];//why do I need this line?
for(j=0;j<temp1in.length;j++){
console.log(tempout1);
var checking = mapvar.layerPointToLatLng(temp1in[j]);
tempout1[j]=mapvar.layerPointToLatLng(temp1in[j]);//each vertex of polygon
console.log(j);
console.log(tempout1);
console.log(checking);
}
temp2out[i]=tempout1;//array of polygons
}
return temp2out;
}
else{
console.log("Unable to process coordinate conversion on array");
return
}
}
但是,“ if(dim === 2)”部分似乎无法正常工作,因此所有console.log行都存在。
特别是,如果我取消注释行
tempout1[j]=mapvar.layerPointToLatLng(temp1in[j]);
的话,赋值//tempout1=[];//why do I need this line?
似乎才起作用。使用console.log,并使用Google Chrome浏览器,我得到以下输出:
First few iterations of loop
Final iteration of the loop
可以看出,最终迭代的值(一个对象)在分配任何内容之前已包含在
tempout1
数组中(我尝试删除了'if(dim === 1)'部分,并重命名tempout1变量(没有运气),并且被Chrome(?!?!?!!)隐藏该值在循环期间不会被覆盖(如console.log(checking)
和console.log(tempout1)
的比较所示)。为什么每次嵌套循环运行之前都必须清理变量?为什么最终迭代的值会在任何事情发生之前就进入?
最佳答案
事实证明,解决方案非常简单-我没有正确声明循环变量(即for (var i=o;i<array.length;i++)
,而不是for (i=o;i<array.length;i++)
)我不确定这如何解释Google Chrome控制台的行为,但似乎一切之后稳定。
关于javascript - 嵌套嵌套的Java循环数组具有隐藏值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47426011/