2016-01-17 62 views
0

我有非常复杂的对象,我需要循环通过多个级别的项目。这非常棘手非常快,我现在卡住了。遍历对象项目

我已经试过(请注意,我添加了一个错误,我得到)

var stuffCount = Object.keys(stuff).length; 

//Loop through initial items in object 
for(i = 0; i < stuffCount; i++) { 

    // Error occurs on this line: 
    // Uncaught TypeError: Cannot read property 'points' of undefined 
    var pointCount = stuff[i].points.length; 

    var coordinates = []; 

    //Loop through points in initial items 
    for(r = 0; r < pointCount; r++) { 

     coordinates.push(new google.maps.LatLng( 
      stuff[i].points[r].lat, 
      stuff[i].points[r].lng)); 
    } 

} 

对象:它更复杂,但我做到了尽可能简单的这个问题的缘故。

var stuff = { 

    first: { 

     center: { 
      lat: 11, 
      lng: 22 
     }, 
     points: [ 
      { 
       lat: 11, 
       lng: 22 
      }, 
      { 
       lat: 33, 
       lng: 44 
      }, 
      { 
       lat: 55, 
       lng: 66 
      }, 
     ] 
    }, 

    second: { 

     center: { 
      lat: 11, 
      lng: 22 
     }, 
     points: [ 
      { 
       lat: 11, 
       lng: 22 
      }, 
      { 
       lat: 33, 
       lng: 44 
      }, 
      { 
       lat: 55, 
       lng: 66 
      }, 
     ] 
    }, 

    third: { 

     center: { 
      lat: 11, 
      lng: 22 
     }, 
     points: [ 
      { 
       lat: 11, 
       lng: 22 
      }, 
      { 
       lat: 33, 
       lng: 44 
      }, 
      { 
       lat: 55, 
       lng: 66 
      }, 
     ] 
    }, 
} 

进出口试图使代码通过使用循环小。它用于在Google地图上显示多边形。我可以一个一个地做,但代码将会很大,因为我有像其中的100个+我希望它是动态的,这样我可以很容易地在将来添加新的多边形而不需要改变很多代码。

我的代码有什么问题?

+0

它有很多问题。设置一个断点,并通过它一次 – charlietfl

回答

1

的问题是,你正试图检索使用编号指数从你的东西对象键。你其实并不需要密钥的计数,使用for...in循环,而不是像这样:

//Loop through initial items in object 
for(var i in stuff) { 

    // Error occurs on this line: 
    // Uncaught TypeError: Cannot read property 'points' of undefined 
    var pointCount = stuff[i].points.length; 

    var coordinates = []; 

    //Loop through points in initial items 
    for(r = 0; r < pointCount; r++) { 

     coordinates.push(new google.maps.LatLng( 
      stuff[i].points[r].lat, 
      stuff[i].points[r].lng)); 
    } 

} 
0

您对钥匙感到困惑。你应该这样做:

var stuffKeys = Object.keys(stuff); 

//Loop through initial items in object 
for(i = 0; i < stuffKeys.length; i++) { 
    var pointCount = stuff[stuffKeys[i]].points.length; 

    var coordinates = []; 

    //Loop through points in initial items 
    for(r = 0; r < pointCount; r++) { 

     coordinates.push(new google.maps.LatLng( 
      stuff[stuffKeys[i]].points[r].lat, 
      stuff[stuffKeys[i]].points[r].lng)); 
    } 
} 

你原来要求stuff[0] ......这是不存在的。您需要stuff[the first key in stuff] ...

+0

更多的问题 – charlietfl

0

您要做的是将点属性从'第一个'取出,所以stuff['first'].points

但是,你在做什么是stuff[0].points,而0不是关键。

这是不优化,但应该传达你需要做什么:

stuff[Object.keys(stuff)[0]].points 
0

您应该使用for in通过对象的属性进行迭代。 for可用于迭代数组类型属性。

0

你的代码有什么问题?您是通过对象键迭代就好像它是一个数组

stuff['first']是不一样的stuff[0]

如何管理呢?我会用lodash,遍历像这样:

_.each(stuff, function(item,name) 
{ 
    _.each(item.points, function(point) 
    { 
     // do whatever 
    }); 
}); 
0

您应该使用for in遍历对象进行迭代。看下面的例子:

var stuffCount = Object.keys(stuff).length; //you don't need this 

for (var obj in stuff) { 

    var pointCount = stuff[obj].hasOwnProperty("points") ? stuff[obj].points.length : null; 
    console.log(pointCount); 

}