Javascript 从图形管理器覆盖阵列中删除元素

Javascript 从图形管理器覆盖阵列中删除元素,javascript,arrays,google-maps,Javascript,Arrays,Google Maps,我目前正在从事一项基于地图的服务。在那里,用户可以通过使用drawingManager绘制矩形和多边形来选择地图上的项目。在创建这些形状后,我将它们推送到全局数组中,以保持对它们的控制,如下所示: google.maps.event.addListener(drawingManager, 'overlaycomplete', function(e) { if (e.type != google.maps.drawing.OverlayType.MARKER) {

我目前正在从事一项基于地图的服务。在那里,用户可以通过使用drawingManager绘制矩形和多边形来选择地图上的项目。在创建这些形状后,我将它们推送到全局数组中,以保持对它们的控制,如下所示:

      google.maps.event.addListener(drawingManager, 'overlaycomplete', function(e) {
      if (e.type != google.maps.drawing.OverlayType.MARKER) {
      // Switch back to non-drawing mode after drawing a shape.
      drawingManager.setDrawingMode(null);
      var newShape = e.overlay;
      all_overlays.push(newShape);
      newShape.type = e.type;
      newShape.id = all_overlays.length-1;
      all_overlays[newShape.id].id = all_overlays.length-1;
}
function deleteSelectedShape() {
if (selectedShape) {
    all_overlays.splice(selectedShape.id,1);
    while(jQuery.inArray(selectedShape.id, selected_shapes) != -1)
        {
        var shape_index = jQuery.inArray(selectedShape.id, selected_shapes);
        selected_shapes.splice(shape_index,1);
        selected_buoys.splice(shape_index,1);
        }
    selectedShape.setMap(null);
    selectedShape = '';
    buildList();
    highlightSelectedBuoys();   
}
用户可以选择删除单个形状。我实现了如下删除:

      google.maps.event.addListener(drawingManager, 'overlaycomplete', function(e) {
      if (e.type != google.maps.drawing.OverlayType.MARKER) {
      // Switch back to non-drawing mode after drawing a shape.
      drawingManager.setDrawingMode(null);
      var newShape = e.overlay;
      all_overlays.push(newShape);
      newShape.type = e.type;
      newShape.id = all_overlays.length-1;
      all_overlays[newShape.id].id = all_overlays.length-1;
}
function deleteSelectedShape() {
if (selectedShape) {
    all_overlays.splice(selectedShape.id,1);
    while(jQuery.inArray(selectedShape.id, selected_shapes) != -1)
        {
        var shape_index = jQuery.inArray(selectedShape.id, selected_shapes);
        selected_shapes.splice(shape_index,1);
        selected_buoys.splice(shape_index,1);
        }
    selectedShape.setMap(null);
    selectedShape = '';
    buildList();
    highlightSelectedBuoys();   
}

不幸的是,这是行不通的。例如,如果我得到一个具有4个形状(id:0,1,2,3)的数组,并删除id=0的数组,则all_overlays数组不会更改其大小,这会在下一步将整个过程搞糟。我的错误在哪里?

忘记
newShape.id
,在拼接后形状的索引将改变

改用: indexOf()方法返回数组中可以找到给定元素的第一个索引,如果该元素不存在,则返回-1。 indexOf使用严格相等(与===或三重相等运算符使用的方法相同)将searchElement与数组的元素进行比较。请注意,如果将-1作为参数传递,则splice不会执行任何操作

完整示例: 注意:这不是完全跨浏览器的,因为并非所有浏览器本机都支持
indexOf

但您可以自己实现。阅读文章以支持旧浏览器。

忘记
newShape.id
,形状的索引将在拼接后更改

改用: indexOf()方法返回数组中可以找到给定元素的第一个索引,如果该元素不存在,则返回-1。 indexOf使用严格相等(与===或三重相等运算符使用的方法相同)将searchElement与数组的元素进行比较。请注意,如果将-1作为参数传递,则splice不会执行任何操作

完整示例: 注意:这不是完全跨浏览器的,因为并非所有浏览器本机都支持
indexOf

但是你可以自己实现。阅读文章以支持旧浏览器。

我写了一个类似的项目

while(overlays.length>0)
{
    var tmpOverlay = overlays.shift();
    tmpOverlay.setMap(null); 
}
其他方式:

for(var i = 0; i < markers.length; i++) { var t = markers[i]; t.setMap(null); t = null; }
for(var i = 0; i < overlays.length; i++) { var t = overlays[i]; t.setMap(null); t = null; }

while (markers.length) { markers.pop(); } 
while (overlays.length) { overlays.pop(); }

overlays = []; markers = []; 

我必须从地图上删除它们,然后重新绘制。设置setMap(null)对我也没有任何作用。

我写了一个类似的项目

while(overlays.length>0)
{
    var tmpOverlay = overlays.shift();
    tmpOverlay.setMap(null); 
}
其他方式:

for(var i = 0; i < markers.length; i++) { var t = markers[i]; t.setMap(null); t = null; }
for(var i = 0; i < overlays.length; i++) { var t = overlays[i]; t.setMap(null); t = null; }

while (markers.length) { markers.pop(); } 
while (overlays.length) { overlays.pop(); }

overlays = []; markers = []; 

我必须从地图上删除它们,然后重新绘制。设置setMap(null)对我也没有任何作用。

在您的代码中,您提到了
newShape.id=all\u overlays.length-1。这是正确的吗?否则,形状id将为负数。这发生在所有重叠之后。推送(newShape)
,所以
所有覆盖。第一个形状的长度-1
为0。我这样做是为了实现基于零的索引。在
deleteSelectedShape
中,您从
所有覆盖中删除项目吗?我想这是由
所有覆盖。拼接(selectedShape.id,1)
完成的,但是我不确定我是否正确理解了拼接的概念。这是正确的吗?否则,形状id将为负数。这发生在所有重叠之后。推送(newShape)
,所以
所有覆盖。第一个形状的长度-1
为0。我这样做是为了实现基于零的索引。在
deleteSelectedShape
中,您从
所有覆盖中删除项目吗?我想这是由
所有覆盖。拼接(selectedShape.id,1)
完成的,但我不确定我是否正确理解了拼接的概念。@Axel反馈。对不起,我周末不在家。更改
所有重叠拼接(selectedShape.id,1)
所有覆盖件拼接(所有覆盖件索引of(selectedShape),1)解决了问题。谢谢你的帮助!我希望我能投票进一步这是困扰了我好几天试图找出如何删除删除形状这是一个巨大的头痛解决方案,谢谢@Axel反馈。对不起,周末不在家。更改
所有重叠拼接(selectedShape.id,1)
所有覆盖件拼接(所有覆盖件索引of(selectedShape),1)解决了问题。谢谢你的帮助!我希望我能投票进一步这是困扰了我好几天试图找出如何删除删除形状这是一个巨大的头痛解决方案,谢谢!