复杂的JS对象

时间:2012-07-18 08:26:16

标签: javascript json google-visualization webtrends

我正在处理一个相当复杂的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]来查看国家/地区对象的数组,但是现在我很难理解如何在每个子对象的命名方式不同的情况下使用它们?我的预期输出是Google Visualization API,如下所示:

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

2 个答案:

答案 0 :(得分:3)

使用For ...在声明中:

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

应该很容易将其与您的需求相匹配。

答案 1 :(得分:2)

Glibnes带着for in建议到达那里,坚持你的变量名称(BTW:在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