-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

@user1689607 的评论在我看来就是答案。当您选择 时no lib (pure JS),您的代码不会记录任何undefined值。问题是:库经常摆弄本机类型的原型。这样做最臭名昭著的库是prototype.js(线索在名称中)。例如,常规、未更改对象的“神奇属性”Array是不可枚举的(即:不会出现在for...in数组的循环中)。但是,当您开始添加自己的属性和方法时,它们很可能出现。由于Array是从原型派生的,因此对该Object原型的任何更改也可能会出现。

它的长短是:永远不要在数组上使用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
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

尝试:

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

您遍历所有 Array 属性。即使它们来自其原型。

于 2012-10-30T14:30:09.183 回答