2016-01-17 3 views
0

У меня довольно сложный объект, и мне нужно пройти через несколько уровней элементов. Это было очень сложно, и я застрял сейчас.Loop через объекты объекта

То, что я пытался (Обратите внимание, что я добавил ошибку я получаю):

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 
      }, 
     ] 
    }, 
} 

Im пытается сделать код меньше, с помощью петель. Он используется для отображения полигонов на Картах 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

Что вы пытаетесь сделать, это получить атрибут точек из «first», поэтому 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); 

} 
Смежные вопросы