0

我正在处理一个相当复杂的 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],
]);
4

2 回答 2

3

用于...在语句中:

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

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

于 2012-07-18T08:33:01.993 回答
2

Glibnes 提出了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
于 2012-07-18T08:43:00.660 回答