【问题标题】:Removing from array when not in ajax call不在 ajax 调用中时从数组中删除
【发布时间】:2017-04-17 14:09:18
【问题描述】:

我有一个函数可以通过 AJAX 从 PHP 文件中调用 GPS 坐标以在地图上显示它们,这一切正常。

该函数检查其获取的标记是否已经在地图上,如果是,则更新其位置,如果不在地图上,则将其添加到地图上。

我现在需要但似乎无法正常工作的是我需要删除以前使用的标记,这些标记不再更新。

这是我的代码:

setInterval(
            $.ajax({
                type: "POST", 
                url: 'markers.php',
                success: function(data){
                    var json_obj = jQuery.parseJSON(JSON.stringify(data));
                    for (var i = 0; i < json_obj.length; i++) {
                        newcoordinate = new google.maps.LatLng(json_obj[i].lat, json_obj[i].lng);
                        if (markersArray[json_obj[i].name] && markersArray[json_obj[i].name].setPosition){
                            markersArray[json_obj[i].name].setPosition(newcoordinate);
                            if(json_obj[i].type == 'onderweg') {
                                markersArray[json_obj[i].name].setIcon(onderweg);
                                var label = markersArray[json_obj[i].name].getLabel();
                                label.color="black";
                                markersArray[json_obj[i].name].setLabel(label);
                            }
                            if(json_obj[i].type == 'leeg') {
                                markersArray[json_obj[i].name].setIcon(leeg);
                                var label = markersArray[json_obj[i].name].getLabel();
                                label.color="black";
                                markersArray[json_obj[i].name].setLabel(label);
                            }
                            if(json_obj[i].type == 'bezet') {
                                markersArray[json_obj[i].name].setIcon(bezet);
                                var label = markersArray[json_obj[i].name].getLabel();
                                label.color="white";
                                markersArray[json_obj[i].name].setLabel(label);
                            }
                            if(json_obj[i].type == 'afwachten') {
                                markersArray[json_obj[i].name].setIcon(afwachten);
                                var label = markersArray[json_obj[i].name].getLabel();
                                label.color="black";
                                markersArray[json_obj[i].name].setLabel(label);
                            }
                            if(json_obj[i].type == 'pauze') {
                                markersArray[json_obj[i].name].setIcon(pauze);
                                var label = markersArray[json_obj[i].name].getLabel();
                                label.color="black";
                                markersArray[json_obj[i].name].setLabel(label);
                            }
                            if(json_obj[i].type == 'geendienst') {
                                markersArray[json_obj[i].name].setIcon(geendienst);
                                var label = markersArray[json_obj[i].name].getLabel();
                                label.color="black";
                                markersArray[json_obj[i].name].setLabel(label);
                            }
                        } else {
                            addMarker(json_obj[i].lat, json_obj[i].lng, json_obj[i].name, json_obj[i].afkorting, json_obj[i].type);
                        }

                    }
                },
                dataType: "json"//set to JSON    
            })    
        }
    ,3000);

有人可以指出正确的方向来解决这个问题吗?

Json 数据:

[{"id":"1505108","0":"1505108","name":"Benny","1":"Benny","afkorting":"Be","2":"Be","address":"","3":"","speed":"0","4":"0","lat":"53.198181","5":"53.198181","lng":"6.563437","6":"6.563437","type":"onderweg","7":"onderweg","ts":"2017-04-17 18:26:34","8":"2017-04-17 18:26:34","ritid":"483648","9":"483648","bedrijf":"1","10":"1","ipadres":"188.207.111.80","11":"188.207.111.80","versie":"10","12":"10","inactief":"0","13":"0","beta":"0","14":"0","onzichtbaar":"0","15":"0"},{"id":"1505110","0":"1505110","name":"Rene","1":"Rene","afkorting":"Re","2":"Re","address":"","3":"","speed":"0","4":"0","lat":"53.182274","5":"53.182274","lng":"6.577085","6":"6.577085","type":"leeg","7":"leeg","ts":"2017-04-17 18:26:37","8":"2017-04-17 18:26:37","ritid":"0","9":"0","bedrijf":"1","10":"1","ipadres":"188.207.126.119","11":"188.207.126.119","versie":"10","12":"10","inactief":"0","13":"0","beta":"0","14":"0","onzichtbaar":"0","15":"0"},{"id":"1505112","0":"1505112","name":"Peter","1":"Peter","afkorting":"Pr","2":"Pr","address":"","3":"","speed":"0","4":"0","lat":"53.196129","5":"53.196129","lng":"6.581492","6":"6.581492","type":"bezet","7":"bezet","ts":"2017-04-17 18:26:39","8":"2017-04-17 18:26:39","ritid":"483650","9":"483650","bedrijf":"1","10":"1","ipadres":"92.69.203.230","11":"92.69.203.230","versie":"10","12":"10","inactief":"0","13":"0","beta":"0","14":"0","onzichtbaar":"0","15":"0"},{"id":"1505113","0":"1505113","name":"Ivar","1":"Ivar","afkorting":"Iv","2":"Iv","address":"","3":"","speed":"0","4":"0","lat":"53.360897","5":"53.360897","lng":"6.414318","6":"6.414318","type":"onderweg","7":"onderweg","ts":"2017-04-17 18:26:39","8":"2017-04-17 18:26:39","ritid":"483649","9":"483649","bedrijf":"1","10":"1","ipadres":"188.207.122.118","11":"188.207.122.118","versie":"10","12":"10","inactief":"0","13":"0","beta":"0","14":"0","onzichtbaar":"0","15":"0"},{"id":"1505114","0":"1505114","name":"Niels","1":"Niels","afkorting":"Ni","2":"Ni","address":"","3":"","speed":"0","4":"0","lat":"53.205700","5":"53.205700","lng":"6.586080","6":"6.586080","type":"bezet","7":"bezet","ts":"2017-04-17 18:26:40","8":"2017-04-17 18:26:40","ritid":"483633","9":"483633","bedrijf":"1","10":"1","ipadres":"92.69.223.185","11":"92.69.223.185","versie":"9","12":"9","inactief":"0","13":"0","beta":"0","14":"0","onzichtbaar":"0","15":"0"},{"id":"1505109","0":"1505109","name":"John","1":"John","afkorting":"Jo","2":"Jo","address":"","3":"","speed":"0","4":"0","lat":"53.200897","5":"53.200897","lng":"6.596990","6":"6.596990","type":"leeg","7":"leeg","ts":"2017-04-17 18:26:36","8":"2017-04-17 18:26:36","ritid":"0","9":"0","bedrijf":"1","10":"1","ipadres":"92.69.230.150","11":"92.69.230.150","versie":"10","12":"10","inactief":"0","13":"0","beta":"0","14":"0","onzichtbaar":"0","15":"0"}]

数组回显:

[_.Ne, _.Ne, _.Ne, _.Ne, _.Ne, _.Ne, Benny: _.Ne, Rene: _.Ne, Peter: _.Ne, Ivar: _.Ne, Niels: _.Ne…]

这就是我得到的......但是每个对象都有自己的值,并且脚本确实有效..

【问题讨论】:

  • 用返回的内容替换整个标记数组不是更简单吗?不会有更新或删除。
  • 你的阵列最初是什么样子的?也许if(in_array) { /* array_push / set new value */ } 可以做到吗?
  • @RusselMadere 我以前做过,但是每次更新时所有标记都会闪烁,这有点烦人。
  • @OldPadawan in_array 只是检查它是否在数组中,我仍然不知道需要删除哪个...
  • @HarmJanvanKammen : 你能显示原始数组,以及最终数组的预期输出吗?

标签: javascript php jquery ajax google-maps


【解决方案1】:

我没有机会对此进行全面测试,但您可以尝试一下。我会说它不是很有效。您遍历两个数组,但至少循环不是嵌套的。

首先稍微更改您的成功处理程序(添加空行以突出显示)。

            success: function(data){

                var idArray = [];

                var json_obj = jQuery.parseJSON(JSON.stringify(data));
                for (var i = 0; i < json_obj.length; i++) {

                    idArray.push(json_obj[i].id);

                    newcoordinate = new google.maps.LatLng(json_obj[i].lat, json_obj[i].lng);
                    ...

然后反向循环遍历标记数组(这里称为数组,使用你的数组名),并拼接新的idArray中不存在的标记数组。

for (var i = array.length - 1; i >= 0; i--)
{
    if (idArray.indexOf(array[i].id) < 0) array.splice(i, -1);
}

通过反向工作,您不会弄乱早期数组成员的索引。

我在地图应用程序中有一组点,我必须即时添加和删除点。在那里我们替换数组,然后重新渲染地图。

关于拼接的更多信息 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-16
    • 2011-09-28
    • 1970-01-01
    • 2012-10-01
    • 2012-12-27
    • 2019-05-17
    • 1970-01-01
    • 2013-05-21
    相关资源
    最近更新 更多