【问题标题】:Removing items that do not exist in JSON from an array从数组中删除 JSON 中不存在的项目
【发布时间】:2018-05-05 17:27:50
【问题描述】:

我得到 JSON 数据:

[
  {"id":'1029',
    "position":
        {
        "lat":'40.690902',
        "long":'-73.993449'
        }
  }
]

然后处理数据并将每个标记添加到myMarkers 并创建一个标记,或者如果它已经存在,则更新地图上的位置:

// Remember markers
var myMarkers = {};

***// Code removed here which gets JSON via ajax //***

// Move data to res variable, just for fun..
var res = data;

// Process the data..
for(var i=0, len=res.length; i<len; i++) {

    // Does this marker exist?
    if(myMarkers.hasOwnProperty(res[i].id)) {

        // Update position
        myMarkers[res[i].id].setPosition(new google.maps.LatLng(res[i].position.lat,res[i].position.long));

    } else {
    // It does NOT exist, create it ..

        var marker = new google.maps.Marker({
            position: new google.maps.LatLng(res[i].position.lat,res[i].position.long),
            map:map,
        });    

        myMarkers[res[i].id] = marker;

    }   

}

到目前为止,一切都很好。现在,我遇到了 JSON 数据可能缺少一些之前创建的并且已经在地图上的项目的问题。在这种情况下,我希望它们完全从myMarkers 中删除并从地图上擦除。我无法理解如何实现这一目标。有什么建议吗?

更新:

我尝试了以下方法来“反转”该过程,但它似乎不起作用,即使它是有意义的(至少对我而言):

for(var i=0, len=myMarkers.length; i<len; i++) {
                console.log("Checking reverse..");

                    //Do we have this marker already?
                    if(data.hasOwnProperty(res[i].id)) {

                        console.log(res[i].id+" exists ..");
                        // Remove it here..

                    } else {

                        console.log(res[i].id+" does NOT exist ..");
                        // Do nothing

                    }


                }

我确定我只是错了一点,但我不知道在哪里。

【问题讨论】:

    标签: jquery json google-maps


    【解决方案1】:

    我创建了一个示例代码 sn-p,它展示了如何从 myMarkersobject 中删除 JSON 数组 dataJSON 中不存在的标记

    let dataJSON = [
      {
      	"id":'1',
        "position":
            {
            "lat":'40.690902',
            "long":'-73.993449'
            }
      },
      {
      	"id":'3',
        "position":
            {
            "lat":'40.690902',
            "long":'-74.993449'
            }
      },
      {
      	"id":'5',
        "position":
            {
            "lat":'41.690902',
            "long":'-73.993449'
            }
      }
    ];
    
    let myMarkers = {
    	'1': new Object(),
      '2': new Object(),
      '3': new Object(),
      '4': new Object(),
      '5': new Object()
    };
    
    let idsFromJSON = dataJSON.map(jsonElem => jsonElem.id);
    console.log("IDs from JSON");
    console.log(idsFromJSON);
    
    let idsFromMarkers = Object.getOwnPropertyNames(myMarkers);
    console.log("IDs from myMarkers");
    console.log(idsFromMarkers);
    
    let jsonSet = new Set(idsFromJSON);
    let markersSet = new Set(idsFromMarkers);
    
    let difference = new Set(
        [...markersSet].filter(x => !jsonSet.has(x)));
    
    difference.forEach(id => {
    		//First you should delete marker from map
        //myMarkers[id].setMap(null);  //commented as we don't have real instances in this example
        //Now delete marker from hash
        delete myMarkers[id];
    });
    
    console.log("Markers after delete");
    console.log(myMarkers);

    我希望这会有所帮助!

    【讨论】:

    • 我能够使用您的代码找到解决方案。非常感谢!
    猜你喜欢
    • 2019-05-02
    • 2021-10-03
    • 2021-10-19
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    相关资源
    最近更新 更多