Javascript For循环在两次迭代后跳过数组中的其余项

Javascript For循环在两次迭代后跳过数组中的其余项,javascript,Javascript,道歉: 如果这是一个非常基本的问题,我很抱歉,我已经环顾了四周,但是由于我从来没有在Javascript对象中获得过非常坚实的基础,我可能在所有错误的地方寻找答案。我对Javascript的掌握还不够扎实,无法在所有JQuery问题中区分出什么是Javascript,在我对Javascript有了更好的理解之前,我不想使用JQuery。多谢各位 问题: 我有一个for循环,它通过一组谷歌地图标记,将它们返回到我打开的地图上的活动状态。这些标记仍然以某种方式存在于数组中,因为当我在这段代码中迭代几

道歉:

如果这是一个非常基本的问题,我很抱歉,我已经环顾了四周,但是由于我从来没有在Javascript对象中获得过非常坚实的基础,我可能在所有错误的地方寻找答案。我对Javascript的掌握还不够扎实,无法在所有JQuery问题中区分出什么是Javascript,在我对Javascript有了更好的理解之前,我不想使用JQuery。多谢各位

问题:

我有一个for循环,它通过一组谷歌地图标记,将它们返回到我打开的地图上的活动状态。这些标记仍然以某种方式存在于数组中,因为当我在这段代码中迭代几次时,它们会随机返回。它将通过一个或两个循环迭代,然后结束。我注意到错误后添加了hasOwnProperty测试,但这并不是像我认为应该的那样跳过数组中的问题项

问题:

为什么我的for循环会跳过我知道存在的数组中的对象

//Code Loop
for (var i in removedMarkerArray)
{
  //test for valid object
  if (!removedMarkerArray[i].hasOwnProperty('title')) continue;
  else alert("You dawg, this stuff passed.");

  //the actual code doing real work, rather than testing.
  if (removedMarkerArray[i].PD == PD)
  {
    removedMarkerArray[i].setMap(map);

    placedMarkerArray.push(removedMarkerArray[i]);
    removedMarkerArray.splice(i, 1);
  }
}

//Example object in the array.
var marker = new google.maps.Marker({
    map: map,
    position: results[0].geometry.location,
    title: location.mouseover,
    PD: location.PD
});

感谢您阅读我的问题,我期待您的回答。

for…in
用于迭代对象的属性。如果要循环遍历数组的标记,请使用常规的
for
循环


这个答案解释了为什么:

for…in
用于迭代对象的属性。如果要循环遍历数组的标记,请使用常规的
for
循环


这个答案解释了原因:

如果
RemovedMarkerary
是一个真正的
数组
你应该使用经典的
for循环
而不是
for in
。所以你应该做一些类似的事情:

for(var i = 0, n = removedMarkerArray.length; i < n; i++){
    console.log(removedMarkerArray[i]); //check desired object in console for debugging
    ..code here
}
for(变量i=0,n=removedMarkerArray.length;i
如果
removedMarkerArray
是一个真实的
数组
,则应使用经典的
for循环
,而不是
for in
。所以你应该做一些类似的事情:

for(var i = 0, n = removedMarkerArray.length; i < n; i++){
    console.log(removedMarkerArray[i]); //check desired object in console for debugging
    ..code here
}
for(变量i=0,n=removedMarkerArray.length;i
我喜欢
forEach
,只要您使用的是实数组,就可以获得更好的可读性

removedMarkerArray.forEach(function(removedMarker, index) {
  //test for valid object
  if (!removedMarker.hasOwnProperty('title')) continue;
  else console.log("You dawg, this stuff passed.");

  //the actual code doing real work, rather than testing.
  if (removedMarker.PD == PD)
  {
    removedMarker.setMap(map);

    removedMarkerArray.splice(index, 1);
    placedMarkerArray.push(removedMarker);
  }
});

我喜欢
forEach
,只要您使用的是真实数组,就可以获得更好的可读性

removedMarkerArray.forEach(function(removedMarker, index) {
  //test for valid object
  if (!removedMarker.hasOwnProperty('title')) continue;
  else console.log("You dawg, this stuff passed.");

  //the actual code doing real work, rather than testing.
  if (removedMarker.PD == PD)
  {
    removedMarker.setMap(map);

    removedMarkerArray.splice(index, 1);
    placedMarkerArray.push(removedMarker);
  }
});

我的代码从映射中删除一个标记的问题并不是因为我使用了for,而是因为我跳过了数组中的项目,而不是最高评分的问题所说的true for循环。当我最初写这篇文章的时候,我认为for…in会保护我不受此影响,但就这一点而言,它的工作原理就像下面的循环一样

我在I变量上添加了一个减量,这样它就可以再次运行同一个索引,而不是跳过一个索引。这现在涉及到我数组中的所有标记

for (var i = 0; i < placedMarkerArray.length; i++)
{
  if (placedMarkerArray[i].PD === PD)
  {
    placedMarkerArray[i].setMap(null);

    console.log(placedMarkerArray[i]);

    removedMarkerArray.push(placedMarkerArray[i]);
    placedMarkerArray.splice(i, 1);
>>  i--;
  }
}
for(变量i=0;i>我--;
}
}

我的代码从映射中删除标记的问题并不是因为我使用了for…,而是因为我跳过了数组中的项目,这是评分最高的问题所说的true for循环。当我最初写这篇文章的时候,我认为for…in会保护我不受此影响,但就这一点而言,它的工作原理就像下面的循环一样

我在I变量上添加了一个减量,这样它就可以再次运行同一个索引,而不是跳过一个索引。这现在涉及到我数组中的所有标记

for (var i = 0; i < placedMarkerArray.length; i++)
{
  if (placedMarkerArray[i].PD === PD)
  {
    placedMarkerArray[i].setMap(null);

    console.log(placedMarkerArray[i]);

    removedMarkerArray.push(placedMarkerArray[i]);
    placedMarkerArray.splice(i, 1);
>>  i--;
  }
}
for(变量i=0;i>我--;
}
}

请缩短问题并对其进行重构,这样会有一个枯燥、不相关的部分,你可以随心所欲地编写,然后是一个包含真实问题的部分,这样我就可以专注于此。我已经清理了问题部分,并分出了一个问题部分。这就解释了我希望更好地回答的问题吗?您应该将
for in
循环更改为经典的
for
循环,正如我在下面的回答中所指出的,并放置
控制台.log(RemovedMarkerary[I])
作为
for
循环的第一行,查看输出是什么以及是否命中每个预期标记。我已将“console.log(removedMarkerArray[I])”添加到for循环的第一行。我可以清楚地看到穿过的物体,但只有一两个物体到达实际的地图,而不是全部。我保持了警报,当我运行此代码时,它仍然只出现两次。在控制台中,当您折叠所有对象时,它们是否具有
PD
属性?下一步我要做的是检查以确保所有这些对象都实际命中该行:
removedMarkerarray[I].setMap(map)请缩短问题并对其进行重构,这样会有一个无聊的、不相关的部分,您可以在其中编写任何您想要的内容,然后是一个包含真实问题的部分,这样我就可以专注于此。我已经清理了问题部分,并划分了一个问题部分。这就解释了我希望更好地回答的问题吗?您应该将
for in
循环更改为经典的
for
循环,正如我在下面的回答中所指出的,并放置
控制台.log(removedMarker