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