2012-11-28 230 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); 
       }); 
      }); 

我希望這可以幫助任何需要類似解決方案的人。