1

为什么我无法访问我的阵列?

function map(array){
    for(i=0; i <=array.length; i++){
        var location=array[i].location;
        console.log("loc"+location);
        var user = array[i].from_user;
        console.log("user"+user);
        var date = array[i].created_at;
        var profile_img = array[i].profile_img;
        var text = array[i].text;
        var contentString = text;
        //geocode(user,date, profile_img, text, contentString,location);
    }
}

它给了我未定义的每个元素。我想访问它并将变量传递给地理编码函数。数据结构:

array=[{user: a,user_id: b,date: c,profile_img: d,text: e,contentString: f,url:
      g,location:o},{user: a,user_id: b,date: c,profile_img: d,text: e,contentString: 
      f,url:g,location:o},{user: a,user_id: b,date: c,profile_img: d,text: 
      e,contentString: f,url: g,location:s}];

不要担心价值观..!

我第一次发帖时忘了提(问题)。数组的位置被插入到前一个函数中,而数组不包含来自前一个函数的属性位置

4

3 回答 3

0

如果array您传入的长度为 0,那么您循环它的方式将尝试访问0 处的列表元素,这将是未定义的。

但是,不管你的内容如何array,​​这行总是会给你带来麻烦:

for(i=0; i <=array.length; i++)

当检查length您的属性时array,它会告诉您数组中的元素数。由于数组使用基于 0 的索引,因此每次使用此循环都会超出数组的边界。

var myArray = [1, 2, 3];
myArrary[0]; // This is 1
myArray[2]; // This is 3

0由于您在和数组的长度之间循环,恰好是3,您尝试访问的最后一个元素将不存在。

myArray[3]; // Undefined

您需要检查i < array.length而不是i <= array.length.

于 2012-08-20T12:21:43.637 回答
0

调用函数时,请使用包含在数组文字中的对象文字构造,否则所有值都将作为未定义返回。这就是你应该如何调用你的函数:

map([{ // array literal enclosing an object literal

    location   : 1,
    from_user  : 2,
    created_at : 3,
    profile_img: 4,
    text       : 5

}]);

此外,在您的循环中,更改:

for (i = 0; i <= array.length; i++ ) ...

...到

for (var i = 0; i < array.length; i++) ...

如果您有一个预定义的数组,请将其命名并将其传递给函数,如下所示:

map(arrayObj)

于 2012-08-20T12:26:10.710 回答
0

你的代码很好。通过提供的输入和功能,您可以获得:

loco
userundefined
loco
userundefined
locs
userundefined

每个用户出现未定义的原因是:

var user = array[i].from_user;
console.log("user"+user);

您传入的对象没有from_user属性,因此很自然地出现未定义。也许你的意思是array[i].user_id

此外,正如 Esthete 指出的那样,由于您检查长度的方式,您正在超出数组的范围。改为这样做:

for(var i = 0, n = array.length; i < n; i++) {
    // your code in here
}

请注意,我以这样的开头ivar因此它不会成为隐式全局。另外,我声明了第二个变量n,这样您只需要访问array.length一次。这是常见的做法。

所以,把它们放在一起:

function map(array){
    for(var i = 0, n = array.length; i < n; i++){
        var location=array[i].location;
        console.log("loc"+location);
        var user = array[i].user_id;
        console.log("user"+user);
        var date = array[i].created_at;
        var profile_img = array[i].profile_img;
        var text = array[i].text;
        var contentString = text;
        //geocode(user,date, profile_img, text, contentString,location);
    }
}
array=[{user: 'a',user_id: 'b',date: 'c',profile_img: 'd',text: 'e',contentString: 'f',url:
      'g',location:'o'},{user: 'a',user_id: 'b',date: 'c',profile_img: 'd',text: 'e',contentString: 
      'f',url:'g',location:'o'},{user: 'a',user_id: 'b',date: 'c',profile_img: 'd',text: 
      'e',contentString: 'f',url: 'g',location:'s'}];

map(array);

请注意,我将您的对象属性更改为字符串 - 这是因为您没有为这些属性提供值,但您可能不想这样做。输出是:

loco
userb
loco
userb
locs
userb

一切都很好。如果您仍然未定义,location那么您的错误必须与o您传入的对象的属性有关。

于 2012-08-20T12:28:52.803 回答