Комплекс JS Объект

Я имею дело с довольно сложным массивом JSON, включенным ниже. Я пытаюсь создать массив объектов Country с их посещениями. Вот образец массива:

{
   "data":[
      {
         "period":"Month",
         "start_date":"2012-06",
         "end_date":"2012-07",
         "attributes":{

         },
         "measures":{
            "Visits":1000000
         },
         "SubRows":[
            {
               "Unknown":{
                  "measures":{
                     "Visits":1000
                  },
                  "SubRows":null
               },
               "**":{
                  "measures":{
                     "Visits":1000
                  },
                  "SubRows":null
               },
               "Afghanistan":{
                  "measures":{
                     "Visits":1000
                  },
                  "SubRows":null
               },
               "Aland Islands":{
                  "measures":{
                     "Visits":1000
                  },
                  "SubRows":null
               },
               "Albania":{
                  "measures":{
                     "Visits":100
                  },
                  "SubRows":null
               },
            }
         ]
      }
   ]
}

я использую data[0].SubRows[0] перейти к массиву объектов страны, но теперь я озадачен, как перейти один ниже, так как каждый подобъект назван по-своему? Мой предполагаемый вывод для API визуализации Google, как показано ниже:

var data = google.visualization.arrayToDataTable([
  ['Country', '% Visits'],
    ['United Kingdom', 1000],
    ['United States', 1000],
    ['France', 1000],
    ['Australia', 1000],
]);

2 ответа

Решение

Глибнес добирается туда с for in предложение, придерживающееся ваших имен переменных (кстати: в JS это объекты, а не массивы... ну, массивы - это объекты, но я не собираюсь быть таким педантичным).

var measures = {};
for (var cName in data[0].SubRows[0])//your country objects
{//it's always a good idea to check if a property is set directly to the object
 //if not, inheritance chain properties will show up here, too
    if (data[0].SubRows[0].hasOwnProperty(cName))
    {
        //assuming this object will Always be set, if not: check first
        measures[cName] = data[0].SubRows[0][cName].measures.Visits;
    }
}

measures теперь будет одноуровневым объектом, где страны являются ключами, а значения - визитами. Не стесняйтесь добавлять дополнительные проверки, или использовать значения непосредственно для создания контента или... что угодно

Что вам действительно нужно, если я правильно понимаю, так это массив массивов:

var result = [['Country', '% Visits']];
for (var cName in data[0].SubRows[0])//your country objects
{
    if (data[0].SubRows[0].hasOwnProperty(cName))
    {
        result.push([cName,data[0].SubRows[0][cName].measures.Visits]);
    }
}

result теперь будет массивом, состоящим из массивов, каждый из которых имеет 2 значения. result[x][0] -> страна и result[x][1] -> значение мер. Посещение:

result[1][0] === 'United Kingdom' && result[1][1] == 1000

Использовать для... в заявлении:

var Country = JSONObject['data']['SubRows'];
var Data = {};
for(name in Country)
{
    Data[name] = Country[name]['measures']['Visits'];
}

Это должно быть легко соответствовать вашим потребностям.

Другие вопросы по тегам