推送值后的未定义数组

时间:2017-02-11 03:26:47

标签: javascript jquery arrays

尝试将两个值推送到数组,以便稍后使用db integration的值。将值添加到数组是顺利的,但是在获取值时,它返回undefined。

var array = [];

var lat = 54.333;
var lng = 12.556;

array.push(lat, lng);

console.log(array[0]); // Returns undefined

如果我只使用console.log(array);

,则数组在控制台中显示如下
Array[0]
- 0: Object
-- 0: 54.333
-- 1: 12.556

在尝试显示阵列时,我是否错过了某种层次结构?

修改 这是一个代码片段,用于确切地为我工作的内容。

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');
}

3 个答案:

答案 0 :(得分:2)

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

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

您可以使用console.dir在记录对象时记录对象:

$.get(url, function(data, status) {
  var lat = data.results[0].geometry.location.lat;
  var lng = data.results[0].geometry.location.lng;
  array.push({ lat, lng });
});

console.dir(array);



var address = 'Champ de Mars, 5 Avenue Anatole France, 75007 Paris, Frankrike';
var array = [];
var url = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + encodeURIComponent(address);

$.get(url, function(data, status) {
  var lat = data.results[0].geometry.location.lat;
  var lng = data.results[0].geometry.location.lng;
  array.push({ lat, lng });
});

console.dir(array);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

如果您想在回调完成后运行代码,可以使用.then来电:

$.get(url, function(data, status) {
  var lat = data.results[0].geometry.location.lat;
  var lng = data.results[0].geometry.location.lng;
  array.push({ lat, lng });
}).then(function() {
  console.dir(array);

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

&#13;
&#13;
var address = 'Champ de Mars, 5 Avenue Anatole France, 75007 Paris, Frankrike';
var array = [];
var url = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + encodeURIComponent(address);

$.get(url, function(data, status) {
  var lat = data.results[0].geometry.location.lat;
  var lng = data.results[0].geometry.location.lng;
  array.push({ lat, lng });
}).then(function() {
  console.dir(array);
  
  if (array[0] === undefined) {
    console.log('this sucks');
  } else {
    console.log('it works');
  }
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

如果您要查找多个地址的坐标,可以push the get calls into an array, and use jQuery's $.when。这只会在所有查找完成后执行。

&#13;
&#13;
var addresses = ['Champ de Mars, 5 Avenue Anatole France, 75007 Paris, Frankrike',
                 'Carrousel de la tour Eiffel, Prom. Quai Branly, 75007 Paris, France'];
var array = [];
var promises = addresses.map(function(address) {
  var url = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + encodeURIComponent(address);
  return $.get(url, function(data, status) {
    var lat = data.results[0].geometry.location.lat;
    var lng = data.results[0].geometry.location.lng;
    array.push({ lat, lng });
  });
});

$.when.apply($, promises).then(function() {
  console.dir(array);
  
  if (array[0] === undefined) {
    console.log('this sucks');
  } else {
    console.log('it works');
  }
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:2)

从你的小提琴样本开始,你的array在控制台中仍然是空的是正常的,因为你正在使用进行异步处理的$.get({{3} })。

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

完成后,您应该会看到array具有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]

这是您的AJAX

修改

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

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;
};

或者如果你不想使用$.get的回调函数,你可以这样做;

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 */
    }

});

答案 2 :(得分:0)

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