2012-11-28 181 views
0

我需要一些帮助,通过从API接收JSON接收的对象以及为图表库组装另一个对象。循环遍历对象

这里是对象的一个​​示例:

var channel_data = [ 
    { 
    "27th Oct 12": { 
     "xaxis": "27th Oct 12", 
     "channels": { 
     "Create and Craft": { 
      "views": 13064, 
      "bandwidth": 623136899214, 
      "name": "Create and Craft" 
     }, 
     "5 USA": { 
      "views": 394, 
      "bandwidth": 17889861768, 
      "name": "5 USA" 
     } 
     }, 
     "totalViews": 25470, 
     "totalBandwidth": 923866774348 
    }, 
    "28th Oct 12": { 
     "xaxis": "28th Oct 12", 
     "channels": { 
     "Create and Craft": { 
      "views": 15298, 
      "bandwidth": 860108829822, 
      "name": "Create and Craft" 
     }, 
     "5 USA": { 
      "views": 500, 
      "bandwidth": 28770314737, 
      "name": "5 USA" 
     } 
     }, 
     "totalViews": 29377, 
     "totalBandwidth": 1248778079465 
    } 
    } 
] 

我需要循环通过这些数据,并构建对象与Highcharts渲染使用的下面的数组。类别将是日期,数据是每个渠道的每个日期的视图。

categories: ['27th Oct 12", "28th Oct 12"] 

series: [{ 
    name: 'Create and Craft', 
    data: [13064, 15298] 
}, { 
    name: '5 USA', 
    data: [394, 500] 
}, { 
}] 

我试过以下,但结束了错误的结构;

var dates = [], channels=[], views = []; 

for (var gdata in channel_data) { 
    dates.push(channel_data[gdata].xaxis); 
    for (var channel in channel_data[gdata].channels){ 
     channel_name = channel_data[gdata].channels[channel].name; 
     channel_views = channel_data[gdata].channels[channel].views; 
     channel_data = {"name" :channel_name,"views" : channel_views} 
     channels.push(channel_data); 
    } 
    views.push(model.attributes[gdata].channels.name.views); 
} 
+1

看看underscore.js,它有很多有用的实用函数集合和数组 –

+0

我试过以下; – stevepop

+0

如果你看看这行''类别:['10月27日','10月28日']你会看到你有一个sintax错误 –

回答

0

您可以使用此

var categories = []; 
var series = []; 
for(var i in channel_data) { 
    categories.push(channel_data[i].xaxis); //your categories 

    //same logic to loop through channels to populate series array 
} 
+2

在数组中不要使用for ... in循环('channel_data'是一组对象) – jbabey

+0

channel_data [i]是一个包含每天频道数据的对象数组,因此channel_data [i] .xaxis是未定义的。 – stevepop

+0

好吧,这只是一个可以工作的理论,但似乎我'米错:) –

0

您正在尝试减少数据结构成另一种形式。

这可以用辅助utils的等来实现_ JS(下划线的js)从他们的网站逐字

http://underscorejs.org/#reduce

var list = [[0, 1], [2, 3], [4, 5]]; 
var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []); 
=> [4, 5, 2, 3, 0, 1] 
0

在一天的与端部中使用的溶液帮助AlanH的想法使用下划线。

var channels = {}; 
      _.each(channel_data, function(date, i) { 
       _.each(date.channels, function(channel, i) { 
        if (channels[channel.name] === undefined) { 
         channels[channel.name] = { 
          name : channel.name, 
          views : [], 
          bandwidth : [] 
         }; 
        } 
         channels[channel.name].views.push(channel.views); 
        channels[channel.name].bandwidth.push(channel.bandwidth); 
       }); 
      }); 

我希望这可以帮助任何需要类似解决方案的人。