2016-09-17 64 views
0

我有这样的数据在Ruby中,创建使用Highcharts.js一个条形图,需要在JSON格式的数据:如何多键哈希转换为单一键散列红宝石Highcharts

data = {["January", "a"]=>54, ["January", "b"]=>13, ["January", "d"]=>2, ["January", "c"]=>1, 
     ["February", "a"]=>27, ["February", "b"]=>11, ["February", "c"]=>4, ["March", "a"]=>22, 
     ["March", "b"]=>11, ["March", "d"]=>2, ["March", "c"]=>2, ["April", "a"]=>32, 
     ["April", "b"]=>12, ["April", "d"]=>6, ["April", "c"]=>2, ["May", "a"]=>7, 
     ["May", "d"]=>3, ["June", "a"]=>5, ["July", "a"]=>25, 
     ["August", "a"]=>23, ["August", "d"]=>3, ["August", "c"]=>3, ["September", "a"]=>6} 

数据存储在一个变量中,而不是来自文件。

我想将其转换为json对象,将它发送给Highcharts进行制图。我需要以下格式的数据:

category = ["January","February","March","April","May","June","July","August","September"] 

series: [{ 
      name: 'a', 
      data: [54, 27, 22, 32, 7, 5, 25, 23, 6] 
     }, { 
      name: 'b', 
      data: [13, 11, 11, 12, 6, 0, 0, 0, 6] 
     }, { 
      name: 'c', 
      data: [1, 4, 0, 2, 0, 0, 0, 3, 6] 
     }, 
      { 
      name: 'd', 
      data: [2, 0, 0, 6, 3, 0, 0, 3, 6] 
     }] 

数据在几个月内丢失,有时不按字母顺序排列。

有没有一种简单的方法在Ruby中取消原始哈希,然后从中提取信息,同时用0填充缺失的值,并根据需要获取JSON输出?

p.s. :试图转换data.to_json,但highchart不接受原始形式。有没有其他方法可以使用Highcharts中的这些数据创建条形图?

回答

1

您可以尝试lazy_high_charts gem用于在我们的控制器本身渲染HighCharts。

因此可以轻松地为您的图表定制数据。

0

我不知道的应该是什么逻辑系列数据阵列内的零被插入,但是这可能让你几乎没有:

def transform(data) 
    hash = { :category => [], :series => [] } 

    data.keys().reduce(hash) { |accum, key| 
    month = key[0] 
    letter = key[1] 

    # Push month 
    accum[:category].push(month) if !accum[:category].include?(month) 

    # Find existing item in series or create new one 
    existing = accum[:series].select { |item| item[:name] == letter } 
    item = existing.length > 0 ? existing[0] : {:name => letter, :data => []} 

    # Push the number value in item's data 
    item[:data].push(data[key]) 

    # Collect item if not already in series array 
    accum[:series].push(item) if existing.length == 0 

    accum 
    } 
end 

result = transform(MY_DATA_HERE) 
result[:series].sort! {|a,b| a[:name] <=> b[:name] } # sort them! 

puts result 

输出:

{ 
    :category=>["January", "February", "March", "April", "May", "June", "July", "August", "September"], 
    :series=>[ 
    {:name=>"a", :data=>[54, 27, 22, 32, 7, 5, 25, 23, 6]}, 
    {:name=>"b", :data=>[13, 11, 11, 12]}, 
    {:name=>"c", :data=>[1, 4, 2, 2, 3]}, 
    {:name=>"d", :data=>[2, 2, 6, 3, 3]} 
    ] 
} 
0
catser = data.each_with_object(category: [], series: {}) do |(k, v), memo| 
    memo[:category] << k.first 
    (memo[:series][k.last] ||= []) << v 
end 
category, series = [ 
    catser[:category].uniq.sort, 
    catser[:series].map { |k, v| { name: k, data: v } } 
]