在控制台中验证数组后,多维数组返回undefined

时间:2018-05-24 16:50:31

标签: javascript arrays

我正在处理Google Maps API脚本,但无法使用我的阵列。下面的屏幕截图显示了下面代码中的console.log语句。有两个数组,它们看起来就像我想要的那样。然后我调试console.log以验证长度(在这种情况下为6)。然后我开始一个从0到5(6减1)的循环。但是验证第一个console.log而不是(markers [i] [0])返回TypeError:x [r]是未定义的。我很困惑,为什么我可以清楚地看到我正在尝试提取值的上方数组。

screenshot

if ($('#propertymap').length){
    var map=new google.maps.Map(document.getElementById('propertymap'), {
        center: {lat: 37.09024, lng: -95.712891},
        zoom: 5
    });
    var bounds=new google.maps.LatLngBounds();
    var geocoder=new google.maps.Geocoder();

    var id;
    var location;
    var street;
    var city;
    var state;
    var zip;
    var squarefootage;
    var ownedacreage;
    var leasedacreage;
    var hotelrooms;
    var website;

    var markers=[];
    var infocontent=[];

    $.post('/_getproperties.php', {task:'getproperties'}, function(result){
        var locationsSplit=result.replace('{', '').split('}');

        var i;
        for (i=0; i<locationsSplit.length-1; i++){
            var currentFields=locationsSplit[i].split('|');

            id=currentFields[0];
            location=currentFields[1];
            street=currentFields[2];
            city=currentFields[3];
            state=currentFields[4];
            zip=currentFields[5];
            squarefootage=currentFields[6];
            ownedacreage=currentFields[7];
            leasedacreage=currentFields[8];
            hotelrooms=currentFields[9];
            website=currentFields[10];

            geocodeAddress(location, street + ', ' + city + ', ' + state + ' ' + zip, location + '<br />' + street + '<br />' + city + ', ' + state + ' ' + zip, i);
        }

        console.log(markers);
        console.log(infocontent);
        console.log(locationsSplit.length-1);

        for (i=0; i<locationsSplit.length-1; i++){
            console.log(i);
            console.log(markers[i][0]);
        }
    });

    function geocodeAddress(locationtitle, locationaddress, locationdescription, i){
        geocoder.geocode({'address': locationaddress}, function(results, status){
            if (status==='OK'){
                markers[i]=[];
                markers[i][0]=locationtitle;
                markers[i][1]=results[0].geometry.location.lat();
                markers[i][2]=results[0].geometry.location.lng();

                infocontent[i]=[];
                infocontent[i][0]=locationdescription;
            } else {
                console.log('Geocode was not successful for the following reason: ' + status);
            }
        });
    }
}

1 个答案:

答案 0 :(得分:2)

geocoder.geocode似乎是异步操作。在程序经历for循环的第一次迭代时,标记和infoContent数组尚未填充。

您在控制台中看到结果为填充数组的原因是因为这些项是对象,并且在设置扩展它们时,它们已经填充了数据。 控制台没有显示您调用console.log时的数据,而是显示此时对象的内容

要验证这一点,不要将标记实例传递给console.log,而是通过调用console.log(JSON.stringify(markers))传递 stringified 版本。我打赌它会显示一个空数组。