-3

コード

var coordinateTratte = {
        "1522-nord": [
             {"Distanza": 0, "Lat": 45.02915, "Lng": 7.606131667},            
             {"Distanza": 0.1, "Lat": 45.02805167, "Lng": 7.605818333}
        ]
    };

for (var key in coordinateTratte) {
    var obj = coordinateTratte[key];
    for (var prop in obj) {  
        console.log(obj[prop].Lat);
    }
}
​

なぜ20が未定義なのですか?

4

4 に答える 4

1

"1522-nord"は、for-inでトラバースしていた配列です。アレイでfor-inを使用しないでください。通常のループを使用します。

for (var key in coordinateTratte) {
    var obj = coordinateTratte[key];
    for (var i = 0; i < obj.length; i++) { // <--
        console.log(obj[i].Lat);
    }
}
于 2012-10-30T14:31:39.587 に答える
1
var coordinateTratte = {"1522-nord":[{"Distanza":0,"Lat":45.02915,"Lng":7.606131667},{"Distanza":0.1,"Lat":45.02805167,"Lng":7.605818333}]};

for (var key in coordinateTratte) {
    var obj = coordinateTratte[key];
    for (var i = 0; i < obj.length; i++) {  
        console.log(obj[i].Lat);
    }
}

フィドル: http: //jsfiddle.net/bdgnJ/

于 2012-10-30T14:28:38.247 に答える
1

@user1689607のコメントが答えのようです。を選択するno lib (pure JS)と、コードは値をログに記録しませんundefined。重要なのは、libsはネイティブタイプのプロトタイプをいじることが多いということです。そうするための最も悪名高いlibはprototype.js(手がかりは名前にあります)です。たとえば、通常の変更されていないオブジェクトの「魔法のプロパティ」は列挙できません(つまり、配列のループに表示されません)。ただし、独自のプロパティとメソッドを追加し始めると、それら表示される可能性があります。はプロトタイプから派生しているため、そのプロトタイプへの変更も表示される可能性があります。Arrayfor...inArrayObject

その長所と短所は次のとおりです。決して、アレイ使用することはありません。for...in(オブジェクトで)使用する場合for...inは、処理しているプロパティがそのオブジェクトに直接設定されており、プロトタイプからのものではないかどうかを常に確認してください。

for (var prop in someObject)
{
    if (someObject.hasOwnProperty(prop))
    {
        //do stuff
    }
}

アレイに関する限り:for(var i=0;i<theArray.length;i++)ほとんどの問題を回避するのに役立つはずです(アレイはJSではスパースであることに注意してください):

var normalArray = [1,2];
var sparseArray = [1,2,3,4];
delete sparseArray[2];//will log [1,2,undefined,4]
for (var i=0;i<sparseArray.length;i++)
{
    if (i < normalArray.length)
    {
        console.log(normalArray[i]);
    }
    console.log(sparseArray[i]);//will log 1 - 2 - undefined - 4
    if (sparseArray.hasOwnProperty(i))
    {
        console.log(sparseArray[i]);//logs 1 - 2 - 4
    }
}
于 2012-10-30T15:16:35.333 に答える
-1

試す:

for (var key in coordinateTratte) {
    var obj = coordinateTratte[key];
    for (var prop in obj) {  
        if(obj.hasOwnProperty(prop))
            console.log(obj[prop].Lat);
    }
}

すべての配列プロパティを繰り返し処理します。それらがそのプロトタイプから来たとしても。

于 2012-10-30T14:30:09.183 に答える