2016-01-17 84 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); 

}