Javascript 推送值后未定义的数组
试图将两个值推送到一个数组中,以便以后使用这些值进行db集成。将值添加到数组进行得很顺利,但是在获取值时返回未定义的值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),那么这个数组在控制台中看起来是这样的 我在尝试显示数组时是否错过了某种层次结构 编辑:
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 */
}
});