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);
}
4

3 に答える 3

0

データ構造を別の形式に縮小しようとしています。

これは、_ 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]
于 2012-11-28T18:35:32.973 に答える
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);
                });
            });

これが、同様のソリューションを必要としている人に役立つことを願っています。

于 2012-11-29T12:22:17.690 に答える
0

You can use this

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
}
于 2012-11-28T18:26:42.803 に答える