2012-10-30 81 views
-3

Code为什么此代码打印20个未定义?

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不确定?

+0

我测试了一下,它的工作完美 – Welling

+0

是,工作原理:http://jsfiddle.net/8ejhR/1/ – lrsjng

+0

您有MooTools加载和其他人显示,您不正确迭代阵列。当你使用jsFiddle时,最好先在左边设置正确的设置,比如从菜单中选择'No-Library(纯JS)'。 –

回答

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); 
    } 
} 
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/

+0

那么,现在22 undefined :) – markzzz

+0

@markzzz编辑 – karaxuna

-1

尝试:

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

您遍历所有阵列的性能。即使它们来自它的原型。

+0

+1: - ]此外,你可以使用http://chris.photobooks.com/json/default.htm为了得到清晰的外观你的结构,看看你什么时候应该循环槽对象和数组。 – gotqn

+1

-1不要在数组中使用,即使它有效。 – 0x499602D2

+0

顺便说一句。对于数组,最好使用简单的'for'循环或'forEach'方法(如果您的代码不必在旧IE上运行 - [检查浏览器兼容性](https://developer.mozilla.org/en-US/)文档/ JavaScript的/参考/ Global_Objects /阵列/的forEach))。 – dreame4

1

@ user1689607的评论似乎是我的答案。当您选择no lib (pure JS)时,您的代码不会记录任何undefined值。事情是:libs经常摆弄本地类型的原型。最臭名昭着的图解是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 
    } 
} 
相关问题