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未定义?
答案 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);
}
}
答案 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);
}
}
迭代所有数组属性。即使它们来自它的原型。