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
}

暗黙のグローバルにならないように前置きiすることに注意してください。また、一度だけアクセスする必要があるようにvar、2 番目の変数を宣言します。これは一般的な方法です。narray.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 に答える