Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在for循环中检查数组的对象_Javascript_Google Maps_Object_Google Maps Api 3 - Fatal编程技术网

Javascript 如何在for循环中检查数组的对象

Javascript 如何在for循环中检查数组的对象,javascript,google-maps,object,google-maps-api-3,Javascript,Google Maps,Object,Google Maps Api 3,大家好,我正在从事一个谷歌地图项目,我正在绘制一段旅程,我正在使用AJAX请求将数据作为一个对象数组返回,然后我在该数组中循环,并创建一个新的latlng对象数组,如下图所示,这一切都非常有效 var pathCoords = []; for (var i = 0; i < Object.keys(data).length; i++) { route = { lat : data[i].latitude,

大家好,我正在从事一个谷歌地图项目,我正在绘制一段旅程,我正在使用AJAX请求将数据作为一个对象数组返回,然后我在该数组中循环,并创建一个新的latlng对象数组,如下图所示,这一切都非常有效

var pathCoords = [];
for (var i = 0; i < Object.keys(data).length; i++) {
                route = {
                    lat : data[i].latitude,
                    lng : data[i].longitude
                }

                pathCoords.push(route);
            }
moveMarker做它所说的事情,移动标记,我试图实现的是调用方法,
centerMapandZoom(markerStart、markerEnd、pathCoords)当for循环结束时,此方法会相应地调整地图并使其居中,我已经搜索并尝试了所有内容,但无法解决此问题,我也尝试了其他答案的解决方案,但这不起作用,如下面的方法

if(i === (Object.keys(data).length-1)){
            console.log("This is the end..."+i+"co=ordinates size "+pathCoords.length);
        }

任何帮助或解决方案,我基本上都在尝试在地图上匹配路线和标记,说我已经尝试使用
bounds.extend(coords);map.fitbounds(bounds)
,这对我也没有帮助,谢谢你

我会用
承诺来利用承诺。所有
要处理这个问题,它看起来像这样:

function delayedMarkerPlace(i) {
    return new Promise(resolve => {
        setTimeout(() => {
            // place the marker
            resolve();
        }, 200 * i)
    });
}

const placeMarkersPromises = [];

for (var i = 0; i < Object.keys(data).length; i++) {
    placeMarkersPromises.push(delayedMarkerPlace(i));
}

Promise.all(placeMarkersPromises).then(() => {
    // action after all markers have been placed
});
函数delayedMarkerPlace(i){
返回新承诺(解决=>{
设置超时(()=>{
//放置标记
解决();
},200*i)
});
}
常量placeMarkersPromissions=[];
对于(var i=0;i{
//放置所有标记后的操作
});

我会利用承诺和承诺。所有的
来处理这个问题,它看起来像这样:

function delayedMarkerPlace(i) {
    return new Promise(resolve => {
        setTimeout(() => {
            // place the marker
            resolve();
        }, 200 * i)
    });
}

const placeMarkersPromises = [];

for (var i = 0; i < Object.keys(data).length; i++) {
    placeMarkersPromises.push(delayedMarkerPlace(i));
}

Promise.all(placeMarkersPromises).then(() => {
    // action after all markers have been placed
});
函数delayedMarkerPlace(i){
返回新承诺(解决=>{
设置超时(()=>{
//放置标记
解决();
},200*i)
});
}
常量placeMarkersPromissions=[];
对于(var i=0;i{
//放置所有标记后的操作
});

您正在循环中创建函数,这意味着i的值是通过引用捕获的,这意味着超时函数执行时i的值将与创建函数时不同

尝试在循环之外创建函数,并传递它所需的所有信息,比如:(不,我没有测试这个,但我希望它能让人理解。)

var on_call=函数(coords,j,end_索引){
var latlng=新的google.maps.latlng(coords.lat,coords.lng);
routeLine.getPath().push(latlng);
移动标记(地图、标记、板条);
如果(j==end\u索引){
log(“这是结束…”+i+“坐标大小”+end_索引+1);
centerMapandZoom(markerStart、markerEnd、pathCoords);
}
}
对于(i=0;i
在循环中创建函数是您想要避免的事情,因为闭包可能会导致最初看起来很奇怪的错误


建议阅读:

您正在循环中创建函数,这意味着i的值是通过引用捕获的,这意味着超时函数执行时i的值将与创建函数时不同

尝试在循环之外创建函数,并传递它所需的所有信息,比如:(不,我没有测试这个,但我希望它能让人理解。)

var on_call=函数(coords,j,end_索引){
var latlng=新的google.maps.latlng(coords.lat,coords.lng);
routeLine.getPath().push(latlng);
移动标记(地图、标记、板条);
如果(j==end\u索引){
log(“这是结束…”+i+“坐标大小”+end_索引+1);
centerMapandZoom(markerStart、markerEnd、pathCoords);
}
}
对于(i=0;i
在循环中创建函数是您想要避免的事情,因为闭包可能会导致最初看起来很奇怪的错误


建议阅读:

因为您已经为以下函数创建了闭包

 for (i = 0; i < pathCoords.length; i++) {
            setTimeout(function(coords) {
                var latlng = new google.maps.LatLng(coords.lat, coords.lng);
                routeLine.getPath().push(latlng);
                moveMarker(map, marker, latlng);
                if(i === (Object.keys(data).length-1)){
                    console.log("This is the end..."+i+"co=ordinates size "+pathCoords.length);
centerMapandZoom(markerStart,markerEnd,pathCoords);
                }

                    //console.log("data link...."+Object.keys(data).length)

            }, 200 * i, pathCoords[i]);
}
解决方法将是使用

for(i=0;i

因为您已经为以下函数创建了闭包

 for (i = 0; i < pathCoords.length; i++) {
            setTimeout(function(coords) {
                var latlng = new google.maps.LatLng(coords.lat, coords.lng);
                routeLine.getPath().push(latlng);
                moveMarker(map, marker, latlng);
                if(i === (Object.keys(data).length-1)){
                    console.log("This is the end..."+i+"co=ordinates size "+pathCoords.length);
centerMapandZoom(markerStart,markerEnd,pathCoords);
                }

                    //console.log("data link...."+Object.keys(data).length)

            }, 200 * i, pathCoords[i]);
}
解决方法将是使用

for(i=0;i
<
i === (Object.keys(data).length-1) // i is already equals to length-1,
for (i = 0; i < pathCoords.length; i++) {
             (function(i){
setTimeout(function(coords) {
                    var latlng = new google.maps.LatLng(coords.lat, coords.lng);
                    routeLine.getPath().push(latlng);
                    moveMarker(map, marker, latlng);
                    if(i === (Object.keys(data).length-1)){
                        console.log("This is the end..."+i+"co=ordinates size "+pathCoords.length);
    centerMapandZoom(markerStart,markerEnd,pathCoords);
                    }

                        //console.log("data link...."+Object.keys(data).length)

                }, 200 * i, pathCoords[i]);
}(i))   
    }
for (i = 0; i < pathCoords.length; i++) {
  //  this is how you do not lose the value of i
  //  waiting for setTimeout to return
  (function(i){ 
    // note the above function has a closure over setTimeout
    // this is where the magic happens because here you create the 
    // execution context or local scope you want to "link" the iteration 
    // to the timer function
    setTimeout(function(coords) {
      var latlng = new google.maps.LatLng(coords.lat, coords.lng);
      routeLine.getPath().push(latlng);
      moveMarker(map, marker, latlng);
      if(i === (Object.keys(data).length-1)){
        console.log("This is the end..."+i+"co=ordinates size" +pathCoords.length);
   centerMapandZoom(markerStart,markerEnd,pathCoords);
      }
    }, 200 * i, pathCoords[i]);

  // the IIFE function gets executed and you pass an 
  // argument that will equal i when passed as a parameter
  // inside the IIFE function

  }(i))   
}
for (let i = 0; i < whatever.length; i++){
  whatever you want;
}