Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 推送值后未定义的数组_Javascript_Jquery_Arrays - Fatal编程技术网

Javascript 推送值后未定义的数组

Javascript 推送值后未定义的数组,javascript,jquery,arrays,Javascript,Jquery,Arrays,试图将两个值推送到一个数组中,以便以后使用这些值进行db集成。将值添加到数组进行得很顺利,但是在获取值时返回未定义的值 var array = []; var lat = 54.333; var lng = 12.556; array.push(lat, lng); console.log(array[0]); // Returns undefined 如果我只使用console.log(array),那么这个数组在控制台中看起来是这样的 我在尝试显示数组时是否错过了某种层次结构 编辑:

试图将两个值推送到一个数组中,以便以后使用这些值进行db集成。将值添加到数组进行得很顺利,但是在获取值时返回未定义的值

var array = [];

var lat = 54.333;
var lng = 12.556;

array.push(lat, lng);

console.log(array[0]); // Returns undefined
如果我只使用
console.log(array),那么这个数组在控制台中看起来是这样的

我在尝试显示数组时是否错过了某种层次结构

编辑: 下面是一段代码片段,说明了哪些东西对我不起作用

var address = 'Champ de Mars, 5 Avenue Anatole France, 75007 Paris,    Frankrike';

var array = [];

$.get('https://maps.googleapis.com/maps/api/geocode/json?address=' +      encodeURIComponent(address), function(data, status) {
      var lat = data.results[0].geometry.location.lat;
      var lng = data.results[0].geometry.location.lng;

      array.push({lat, lng});
  });

console.log(array)

if (array[0] === undefined) {
    console.log('this sucks');
} else {
    console.log('it works');
}

您将看到未定义,因为这是console.log的返回值。也就是说,console.log没有返回值,因此您可以在控制台中看到未定义的对象。

console.log
显示对象展开时的状态,而不是记录时的状态

因为jQuery get调用是异步的,所以在记录
array
时,它是一个空数组;但是当您在控制台中展开它时,AJAX调用已经完成,数组已经填充完毕。在记录
array[0]
时,
array
仍然是空数组,因此索引0处没有索引,因此返回
undefined

您可以使用
console.dir
按记录对象时的状态记录对象:

$.get(url、函数(数据、状态){
var lat=data.results[0].geometry.location.lat;
var lng=data.results[0].geometry.location.lng;
array.push({lat,lng});
});
console.dir(数组);
var地址='Champ de Mars,法国阿纳托尔大道5号,法兰克福巴黎75007号';
var数组=[];
var url='1〕https://maps.googleapis.com/maps/api/geocode/json?address=“+编码元件(地址);
$.get(url、函数(数据、状态){
var lat=data.results[0].geometry.location.lat;
var lng=data.results[0].geometry.location.lng;
array.push({lat,lng});
});
console.dir(数组)

在fiddle中的示例中,控制台中的
数组仍然为空是正常的,因为您使用的是执行异步进程()的数组

简而言之,在
$.get
操作完成之前记录输出

当它完成时,您应该看到您的
阵列
具有lat和lng值

您会注意到控制台中的输出如下:

var address = 'Champ de Mars, 5 Avenue Anatole France, 75007 Paris, Frankrike';
var array = [];

$.get('https://maps.googleapis.com/maps/api/geocode/json?address=' + encodeURIComponent(address), function(data, status) {
    var lat = data.results[0].geometry.location.lat;
    var lng = data.results[0].geometry.location.lng;

    /* Array got pushed here */
    array.push({
        lat,
        lng
    });

    /* This console is executed 3rd */
    console.log("Array just got pushed with lat n lng :::", array);
});

/* This console is executed 1st */
console.log("Printing value of array 1 :::", array)


/* These consoles are executed 2nd */
if (array[0] === undefined) {
    console.log('this sucks');
} else {
    console.log('it works');
}
这是您的
console.log的结果

> Printing value of array 1 ::: []
> this sucks
> Array just got pushed with lat n lng ::: [Object]
这是你的

编辑:

根据你的评论,实现你想要的一种方法可能是这样的

var getAddressLatLng = function (address) {
    var defer = $.Deferred();

    $.get('https://maps.googleapis.com/maps/api/geocode/json?address=' + encodeURIComponent(address), function (data) {
        if (data && data.results && data.results.length) {
            var res = data.results[0];

            if (typeof(res) === "object" && res.hasOwnProperty("geometry") && res.geometry.hasOwnProperty("location") && typeof(res.geometry.location) === "object") {
                var lat = res.geometry.location.lat,
                    lng = res.geometry.location.lng;

                if (lat && lng) {
                    defer.resolve({
                        "latitude": lat,
                        "longitude": lng
                    });
                }
            }
        }

        defer.resolve(null);
    });

    return defer;
};
或者,如果您不想使用
$,则可以使用
的回调函数

var getAddressLatLng = function (address) {
    return $.get('https://maps.googleapis.com/maps/api/geocode/json?address=' + encodeURIComponent(address)).then(function (data) {
        if (data && data.results && data.results.length) {
            var res = data.results[0];

            if (typeof(res) === "object" && res.hasOwnProperty("geometry") && res.geometry.hasOwnProperty("location") && typeof(res.geometry.location) === "object") {
                var lat = res.geometry.location.lat,
                    lng = res.geometry.location.lng;

                if (lat && lng) {
                    return {
                        "latitude": lat,
                        "longitude": lng
                    };
                }
            }
        }

        return null;
    });
}; 
要使用它,只需调用以下函数:

getAddressLatLng("Champ de Mars, 5 Avenue Anatole France, 75007 Paris, Frankrike").then(function (result) {
    /* result is either 'null' or an object with 'lat' and 'lng' property */
    if (result) {
        console.log("RESULT:: ", result);
        /* And you can do your db operation here */
    }

});

你的代码看起来不错。。请注意,
console.log
返回
undefined
,但它应该打印出
array[0]
值。
array[0]
与您期望的是
54.333
。您是否试图直接从控制台记录此操作?如果是这样,您只需键入
array[0]
即可查看其值。我不会从您的代码中得到未定义的值@乔兹:嗯,维尔德。我在JSFIDLE上上传了一个更具体的示例。。我想我现在明白了。非常感谢!有没有更简单的方法来完成这个过程,比如说如果我想把这些信息添加到数据库中?如果没有,是否仍有控制API加载何时完成的方法?@h.johan您可以在
$内的
数组
被推送后立即执行代码来实现这一点。get
回调函数(我放在第三个控制台的地方)是否可以添加某种
返回
因此我以后与数据库集成时不会添加空字段?
.get
已返回承诺,为什么需要返回另一个承诺,并在解决
.get
承诺时解决该承诺?您可以只返回
.get
@TinyGiant的结果,我没有返回
$.get
,而是在其回调函数中执行结果。然而,我编辑了我的答案,你可能会认为它是好的,非常感谢!那么,您在上一个示例中添加的函数
。然后
将保存脚本直到
$。get
完成?是的,它是一个
getAddressLatLng("Champ de Mars, 5 Avenue Anatole France, 75007 Paris, Frankrike").then(function (result) {
    /* result is either 'null' or an object with 'lat' and 'lng' property */
    if (result) {
        console.log("RESULT:: ", result);
        /* And you can do your db operation here */
    }

});