Q: How do I iterate through an json object that has nested objects to get the data I need I have a json object and I need to get two pieces of data from nested objects within it. 
Here is the json object


{
  "versionRoomPoolList": [{
      "roomPoolDisplayId": 1,
      "roomPoolStatus": "NOCHANGE",
      "roomPoolCode": "GENR",
      "miosSRC": "YA",
      "sna": "N",
      "maxOccupancyStatus": "NOCHANGE",
      "newMaxOccupancy": 2,
      "currentMaxOccupancy": 2,
      "capacityStatus": "NOCHANGE",
      "newCapacity": 0,
      "currentCapacity": 0,
      "excludeAlways": false,
      "excludeOverAuth": false,
      "propertySellOnly": false,
      "versionRoomTypeList": [{
        "roomTypeDisplayOrderId": 1,
        "roomTypeId": 1,
        "roomTypeStatus": "NOCHANGE",
        "roomPool": "GENR",
        "maxOccupancyStatus": "NOCHANGE",
        "newMaxOccupancy": 2,
        "currentMaxOccupancy": 2,
        "capacityStatus": "NOCHANGE",
        "newCapacity": 0,
        "currentCapacity": 0,
        "guaranteed": 0,
        "minAvailability": null,
        "premium": false,
        "eliteAvailability": false,
        "pmsRoomType": null,
        "isROH": false,
        "versionRoomTypeAttributeList": [{
          "attributeDisplayId": 1,
          "attributeStatus": "NOCHANGE",
          "attributeCode": "GU",
          "attributeDescription": "Guest Room"
        }]
      }]
    },
    {
      "roomPoolDisplayId": 2,
      "roomPoolStatus": "NOCHANGE",
      "roomPoolCode": "DLUX",
      "miosSRC": "YB",
      "sna": "N",
      "maxOccupancyStatus": "NOCHANGE",
      "newMaxOccupancy": 2,
      "currentMaxOccupancy": 2,
      "capacityStatus": "NOCHANGE",
      "newCapacity": 238,
      "currentCapacity": 238,
      "excludeAlways": false,
      "excludeOverAuth": false,
      "propertySellOnly": false,
      "versionRoomTypeList": [{
        "roomTypeDisplayOrderId": 2,
        "roomTypeId": 20,
        "roomTypeStatus": "NOCHANGE",
        "roomPool": "DLUX",
        "maxOccupancyStatus": "NOCHANGE",
        "newMaxOccupancy": 3,
        "currentMaxOccupancy": 3,
        "capacityStatus": "NOCHANGE",
        "newCapacity": 6,
        "currentCapacity": 6,
        "guaranteed": 4,
        "minAvailability": 1,
        "premium": false,
        "eliteAvailability": false,
        "pmsRoomType": null,
        "isROH": false,
        "versionRoomTypeAttributeList": [{
            "attributeDisplayId": 1,
            "attributeStatus": "NOCHANGE",
            "attributeCode": "GU",
            "attributeDescription": "Guest Room"
          },
          {
            "attributeDisplayId": 4,
            "attributeStatus": "NOCHANGE",
            "attributeCode": "HF",
            "attributeDescription": "High Floor, 11th floor and above"
          },
          {
            "attributeDisplayId": 3,
            "attributeStatus": "NOCHANGE",
            "attributeCode": "KN",
            "attributeDescription": "1 King Bed"
          },
          {
            "attributeDisplayId": 2,
            "attributeStatus": "NOCHANGE",
            "attributeCode": "SB",
            "attributeDescription": "Sofabed"
          },
          {
            "attributeDisplayId": 5,
            "attributeStatus": "NOCHANGE",
            "attributeCode": "SE",
            "attributeDescription": "Separate Shower and Bathtub"
          }
        ]
      }]
    }
  ]
}


There are two pieces of data I am trying to get and place into columns in a data grid. The first value are from the key versionRoomPoolList.roomPoolCode and versionRoomPoolList.versionRoomTypeList.versionRoomTypeAttributeList.attributeCode
I am trying to do this using for loops here is what I have so far:


var v2 = versionRoomPools;
roomPool,
roomTypes,
roomType,
i,
k = [],
  j;
for (i = 0;
  (roomPool = v2.versionRoomPoolList[i]); i++) {
  k.push(roomPool);
  roomTypes = roomPool.versionRoomTypeList;
  for (j = 0;
    (roomType = roomTypes[j]); j++) {
    k.push(roomType);
  }
}


I am getting stuck on how to iterate through the nested objects. 

A: You should access your objects like this.
console.log(data.versionRoomPoolList[0].roomPoolCode); // roomPoolCode
data.versionRoomPoolList[0].versionRoomTypeList[0].versionRoomTypeAttributeList.forEach(v => {
    console.log(v)
})

We can also loop through all the keys and if it is a nested object recall the function.
function search(o) {
    Object.keys(o).forEach(function (k) {
        console.log('Searched', o, o[k]);
        if (o[k] !== null && typeof o[k] === 'object') {
            search(o[k]);
            return;
        }
        console.log(o[k] === o['roomPoolCode']); // Logic
        if (o[k] === o['roomPoolCode'] {
            // Do whatever with it
        }
        return o[k];
    });
}



let data = {
    "versionRoomPoolList": [{
        "roomPoolDisplayId": 1,
        "roomPoolStatus": "NOCHANGE",
        "roomPoolCode": "GENR",
        "miosSRC": "YA",
        "sna": "N",
        "maxOccupancyStatus": "NOCHANGE",
        "newMaxOccupancy": 2,
        "currentMaxOccupancy": 2,
        "capacityStatus": "NOCHANGE",
        "newCapacity": 0,
        "currentCapacity": 0,
        "excludeAlways": false,
        "excludeOverAuth": false,
        "propertySellOnly": false,
        "versionRoomTypeList": [{
            "roomTypeDisplayOrderId": 1,
            "roomTypeId": 1,
            "roomTypeStatus": "NOCHANGE",
            "roomPool": "GENR",
            "maxOccupancyStatus": "NOCHANGE",
            "newMaxOccupancy": 2,
            "currentMaxOccupancy": 2,
            "capacityStatus": "NOCHANGE",
            "newCapacity": 0,
            "currentCapacity": 0,
            "guaranteed": 0,
            "minAvailability": null,
            "premium": false,
            "eliteAvailability": false,
            "pmsRoomType": null,
            "isROH": false,
            "versionRoomTypeAttributeList": [{
                "attributeDisplayId": 1,
                "attributeStatus": "NOCHANGE",
                "attributeCode": "GU",
                "attributeDescription": "Guest Room"
            }]
        }]
    },
        {
            "roomPoolDisplayId": 2,
            "roomPoolStatus": "NOCHANGE",
            "roomPoolCode": "DLUX",
            "miosSRC": "YB",
            "sna": "N",
            "maxOccupancyStatus": "NOCHANGE",
            "newMaxOccupancy": 2,
            "currentMaxOccupancy": 2,
            "capacityStatus": "NOCHANGE",
            "newCapacity": 238,
            "currentCapacity": 238,
            "excludeAlways": false,
            "excludeOverAuth": false,
            "propertySellOnly": false,
            "versionRoomTypeList": [{
                "roomTypeDisplayOrderId": 2,
                "roomTypeId": 20,
                "roomTypeStatus": "NOCHANGE",
                "roomPool": "DLUX",
                "maxOccupancyStatus": "NOCHANGE",
                "newMaxOccupancy": 3,
                "currentMaxOccupancy": 3,
                "capacityStatus": "NOCHANGE",
                "newCapacity": 6,
                "currentCapacity": 6,
                "guaranteed": 4,
                "minAvailability": 1,
                "premium": false,
                "eliteAvailability": false,
                "pmsRoomType": null,
                "isROH": false,
                "versionRoomTypeAttributeList": [{
                    "attributeDisplayId": 1,
                    "attributeStatus": "NOCHANGE",
                    "attributeCode": "GU",
                    "attributeDescription": "Guest Room"
                },
                    {
                        "attributeDisplayId": 4,
                        "attributeStatus": "NOCHANGE",
                        "attributeCode": "HF",
                        "attributeDescription": "High Floor, 11th floor and above"
                    },
                    {
                        "attributeDisplayId": 3,
                        "attributeStatus": "NOCHANGE",
                        "attributeCode": "KN",
                        "attributeDescription": "1 King Bed"
                    },
                    {
                        "attributeDisplayId": 2,
                        "attributeStatus": "NOCHANGE",
                        "attributeCode": "SB",
                        "attributeDescription": "Sofabed"
                    },
                    {
                        "attributeDisplayId": 5,
                        "attributeStatus": "NOCHANGE",
                        "attributeCode": "SE",
                        "attributeDescription": "Separate Shower and Bathtub"
                    }
                ]
            }]
        }
    ]
}

function search(o,) {
    Object.keys(o).forEach(function (k) {
        console.log('Searched', o, o[k]);
        if (o[k] !== null && typeof o[k] === 'object') {
            search(o[k]);
            return;
        }
        console.log(o[k] === o['roomPoolCode']); // o Something
        return o[k];
    });
}

search(data);

   


