为什么这段代码打印20 undefined?

时间:2012-10-30 14:26:22

标签: javascript object return iteration undefined

Code

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 个答案:

答案 0 :(得分: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/

答案 1 :(得分: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);
    }
}

答案 2 :(得分:1)

@ user1689607的评论似乎是我的答案。选择no lib (pure JS)后,您的代码不会记录任何undefined值。问题是:libs经常摆弄原生类型的原型。最臭名昭着的lib是prototype.js(线索在名称中)。例如,常规的,未改变的Array对象的“magic property”不可枚举(即:不会出现在数组的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
    }
}

答案 3 :(得分:-1)

尝试:

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

迭代所有数组属性。即使它们来自它的原型。