我从专有数据库中获取数据(Sybase Advantage ADS) 通过自编写的API,利用PHP并将结果作为JSON返回
所以我有一个看起来像这样的结果
[
{"year"=>"2016", "month"=>"1", "total"=>"1223"},
{"year"=>"2016", "month"=>"2", "total"=>"613"},
{"year"=>"2016", "month"=>"3", "total"=>"12351"},
{"year"=>"2017", "month"=>"1", "total"=>"123123"},
{"year"=>"2017", "month"=>"2", "total"=>"613123"},
{"year"=>"2017", "month"=>"3", "total"=>"123"}
]
这是我在Ruby中检索的,现在为了使用Date我想创建一个像这样的Hash:
[
{:name => "2017", :data => {"1" => 123123, "2" => 613123, "3" => 123}},
{:name => "2016", :data => {"1" => 1223, "2" => 613, "3" => 12351}}
]
这个大数组是按年份键分割和合并的,每个组合包含月份和总数。
此外,我想利用月份的值作为总数的关键。
任何帮助我入门的帮助都会非常感激。
答案 0 :(得分:0)
您将需要开始使用Ruby的#group_by
方法,该方法将按行分组行,将年份作为键和匹配行的数组作为值:
>> groups = result.group_by { |row| row['year'] }
=> {"2016"=>
[{"year"=>"2016", "month"=>"1", "total"=>"1223"},
{"year"=>"2016", "month"=>"2", "total"=>"613"},
{"year"=>"2016", "month"=>"3", "total"=>"12351"}],
"2017"=>
[{"year"=>"2017", "month"=>"1", "total"=>"123123"},
{"year"=>"2017", "month"=>"2", "total"=>"613123"},
{"year"=>"2017", "month"=>"3", "total"=>"123"}]}
接下来,您将使用#map
转换您的数据:
>> grouped_rows = groups.map { |year, values| {name: year, data: values.map { |value| [value['month'], value['total']] }.to_h} }
=> [{:name=>"2016", :data=>{"1"=>"1223", "2"=>"613", "3"=>"12351"}},
{:name=>"2017", :data=>{"1"=>"123123", "2"=>"613123", "3"=>"123"}}]
如果您希望按行显示排序的行,则可以通过在结果上调用#sort_by
来完成:
>> grouped_rows.sort_by { |row| -row[:name].to_i }
=> [{:name=>"2017", :data=>{"1"=>"123123", "2"=>"613123", "3"=>"123"}},
{:name=>"2016", :data=>{"1"=>"1223", "2"=>"613", "3"=>"12351"}}]