试图在数组中调用object,返回undefined

时间:2017-03-13 13:51:37

标签: javascript arrays object

我正在尝试调用数组中唯一的对象,但这总是返回undefined。如果我记录整个数组我可以看到它的一切,如果我调用它的对象它返回undefined!

代码:

var pos = [];

this code is inside a function____

if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position) { 
        pos.latlng = {
          lat: position.coords.latitude,
          lng: position.coords.longitude
        };  
        console.log(position.coords.latitude);

    });
}

 console.log(pos.latlng);  <--- undefined
 console.log(pos);         <--- works fine
 console.log(pos[0].latlng); <--- also tried this

console.log(pos);

的结果
Object
latlng : Object
   lat : 52.136624499999996
   lng : 5.3469106
   __proto__:Object
__proto__:Object

6 个答案:

答案 0 :(得分:2)

我建议将新对象推送到pos

pos.push({
    lat: position.coords.latitude,
    lng: position.coords.longitude
});

访问

pos[0].lat

答案 1 :(得分:0)

这里的问题是getCurrentPosition是异步的。作为参数提供的函数(也称为回调函数)在获取当前位置之前不会被调用。

我不知道你在这里使用什么来获取当前位置,但是你需要确保在调用回调之前不要使用结果。

答案 2 :(得分:0)

这是因为您首先将pos定义为数组,然后将其视为匿名对象。将其作为数组或匿名对象。

如果你想拥有latlan属性,那么在代码的开头定义pos如下:

pos = {};

否则,您无法获得阵列的属性。所以你需要删除它并将0索引作为lon,将第一个索引作为纬度:

pos = [];
pos.push(position.coords.longitude); // pos[0];
pos.push(position.coords.latitude); // pos[1];

答案 3 :(得分:0)

基于@ibrahim-mahrir所说的内容。

你可以承诺重新获得你的职位:

var pos = {};

this code is inside a function____

    getPos(){

      return new Promise(function(resolve){
        if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function(position) { 
             resolve({
              lat: position.coords.latitude,
              lng: position.coords.longitude
            });  
        });
      });
    }

getPos().then(function(pos){

  console.log(pos.lat);
  console.log(pos.lng);
})

答案 4 :(得分:0)

pos应该是一个对象(但这不是错误的来源)。

错误可能是由于函数getCurrentPosition的异步引起的。如果它以异步方式工作,那么日志记录将在值被分配给pos之前发生。您应该在getCurrentPosition的回调中进行日志记录,或者在函数内部进行日志记录并从回调内部调用它。

var pos = {}; // object

if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position) { 
        pos.latlng = {
            lat: position.coords.latitude,
            lng: position.coords.longitude
        };


        // SOLUTION ONE: use pos here
        console.log(pos);
        console.log(pos.lating);

        // SOLUTION TWO: call a function that do the logging
        logPos();
    });
}

function logPos() {  // will be called after the value is assigned
    console.log(pos);
    console.log(pos.lating);
}

答案 5 :(得分:0)

实际上一个数组是一个对象,除了它的属性是0到2³² - 2和length属性之间的数字,所以是的,你可以这样做:

 var pos = [];
    pos.inneObject= {//object
      prop: 'property'
    };

pos.innerObject将存在。但是如果你尝试console.log(pos),你会得到'[]',但如果你这样做

for (properties in pos){
console.log(pos[properties])// you will get pos.innerObject
}

因此,您的问题是别的!在这里您可以在创建属性之前记录该属性,在navigator.geolocation.getCurrentPosition的回调中移动您的console.log,如下所示:

var pos = [];

this code is inside a function____

if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position) { 
        pos.latlng = {
          lat: position.coords.latitude,
          lng: position.coords.longitude
        };  
        console.log(position.coords.latitude);

 console.log(pos.latlng);  <--- undefined
 console.log(pos);         <--- works fine
 console.log(pos[0].latlng); <--- also tried this

    });
}

应该有用;