Ruby 帮助转换数组和散列

Ruby 帮助转换数组和散列,ruby,arrays,hash,Ruby,Arrays,Hash,我试图在我的web应用程序中使用Highcharts,但我在让阵列匹配Highcharts所需的输出时遇到了一些问题,基本上hightcharts在其JS中需要这样的输出: series: [{ name: 'person', data: [1562, 873, 1457] }, { name: 'car', data: [7323, 324, 1233] }, { name: 'SUV', data: [832, 6232, 4432] }] 在这种情况下

我试图在我的web应用程序中使用Highcharts,但我在让阵列匹配Highcharts所需的输出时遇到了一些问题,基本上hightcharts在其JS中需要这样的输出:

series: [{
   name: 'person',
   data: [1562, 873, 1457]
}, {
   name: 'car',
   data: [7323, 324, 1233]
}, {
   name: 'SUV',
   data: [832, 6232, 4432]
}]
在这种情况下,数据数组中的每一项都是新的一天,我的问题是我的数据组织方式有点不同,试图转换数据以匹配这一点一直是一件令人头痛的事情。基本上我的输出是这样的:

[
  {:date=>"Sun, 10 Apr 2011", :object_types=>[
    {:count=>4279, :class_name=>"person"}, 
    {:count=>8785, :class_name=>"car"}, 
    {:count=>2153, :class_name=>"SUV"}
  ]}, 
  {:date=>"Sat, 09 Apr 2011", :object_types=>[
    {:count=>12206, :class_name=>"person"}, 
    {:count=>29095, :class_name=>"car"}, 
    {:count=>7565, :class_name=>"SUV"}
  ]}, 
  {:date=>"Fri, 08 Apr 2011", :object_types=>[
    {:count=>4159, :class_name=>"person"}, 
    {:count=>8043, :class_name=>"car"}, 
    {:count=>1982, :class_name=>"SUV"}
  ]}
] 
因此,我似乎首先需要将项目按(在我的情况下)分组,然后在
:按天计数
数据中的每个项目

我很难找到“ruby方式”来优雅地完成这项工作,正如您可能看到的那样,我在处理数组和散列方面并不是超级棒,但是如果您能帮助我以正确的方式完成这项工作,我将不胜感激



第二,我最初试图在查询中使用
group()
来完成这项工作,但这似乎没有多大帮助,是吗?我必须解决的另一件事是,如果没有记录,则用“0”填充日期。。。但我想接下来我会解决这个问题。

类似的方法应该会奏效:

def convert_data(input) 
  hash = {} 
  input.each do |o| 
    o[:object_types].each do |ot| 
      if hash[ot[:class_name]] 
        hash[ot[:class_name]] << ot[:count] 
      else 
        hash[ot[:class_name]] = [ot[:count]] 
      end 
    end 
  end 
  hash.map {|k,v| {'name' => k, 'data' => v}}
end
def convert_数据(输入)
哈希={}
输入。每个do|o|
o[:对象类型]。每个do | ot |
如果散列[ot[:类名称]]
散列[ot[:class_name]]k,'data'=>v}
结束

您可以使用输入数据调用此函数,并且您得到了一个符合Highcharts库所需格式的对象。

类似的操作应该可以:

def convert_data(input) 
  hash = {} 
  input.each do |o| 
    o[:object_types].each do |ot| 
      if hash[ot[:class_name]] 
        hash[ot[:class_name]] << ot[:count] 
      else 
        hash[ot[:class_name]] = [ot[:count]] 
      end 
    end 
  end 
  hash.map {|k,v| {'name' => k, 'data' => v}}
end
aux = Hash.new(Array.new)
series = Array.new

# After this code the aux hash will look something like this: {:person => [4159, 1231, 255], :suv => [1231, 4123, 5411], :car => [321, 312, 541]}
raw_array.each do |date_hash|
  date_hash[:object_types].each do |inf|
    aux[inf[:class_name]] << inf[:count]
  end
end

aux.each { |k,v| series << {:name => k.to_s, :data => v} }
def convert_数据(输入)
哈希={}
输入。每个do|o|
o[:对象类型]。每个do | ot |
如果散列[ot[:类名称]]
散列[ot[:class_name]]k,'data'=>v}
结束
您可以使用输入数据调用此函数,得到一个符合Highcharts库所需格式的对象。

aux=Hash.new(Array.new)
aux = Hash.new(Array.new)
series = Array.new

# After this code the aux hash will look something like this: {:person => [4159, 1231, 255], :suv => [1231, 4123, 5411], :car => [321, 312, 541]}
raw_array.each do |date_hash|
  date_hash[:object_types].each do |inf|
    aux[inf[:class_name]] << inf[:count]
  end
end

aux.each { |k,v| series << {:name => k.to_s, :data => v} }
series=Array.new #在这段代码之后,辅助散列将如下所示:{:person=>[4159123155],:suv=>[123141235411],:car=>[321312541]} 原始数组。每个do |日期散列| 日期散列[:对象类型]。每个do | inf| aux[inf[:class_name]]v}
那么,该系列阵列就是您所需要的。只需像json一样呈现它。

aux=Hash.new(Array.new)
series=Array.new
#在这段代码之后,辅助散列将如下所示:{:person=>[4159123155],:suv=>[123141235411],:car=>[321312541]}
原始数组。每个do |日期散列|
日期散列[:对象类型]。每个do | inf|
aux[inf[:class_name]]v}

那么,该系列阵列就是您所需要的。就像json一样呈现它。

我会使用
可枚举的#groupby
,因为这是比较难的部分;剩下的只是基本的转变:

r = data.flat_map{|h| h[:object_types]}.
  group_by{|h| h[:class_name]}.
  map do |class_name, hashes|
    {:name => class_name, :data => hashes.map{|h| h[:count]}}
  end

注意:
groupby
在ActiveRecord或Ruby 1.8.7+中
flat_map
是Ruby 1.9.2的新功能。使用正确的版本,或者。

我会使用
可枚举的#groupby
,因为这是比较难的部分;剩下的只是基本的转变:

r = data.flat_map{|h| h[:object_types]}.
  group_by{|h| h[:class_name]}.
  map do |class_name, hashes|
    {:name => class_name, :data => hashes.map{|h| h[:count]}}
  end

注意:
groupby
在ActiveRecord或Ruby 1.8.7+中
flat_map
是Ruby 1.9.2的新功能。使用正确的版本,或者。

您可能是指
Hash.new{h,k{h[k]=[]}
,而不是
Hash.new(Array.new)
Nope
Hash.new([])
Hash.new{[]}
Hash.new{{h,k}h[k]=[]}
是不同的。请参阅&您可能是指
Hash.new{h,k{h[k]=[]}
,而不是
Hash.new(Array.new)
Nope
Hash.new([])
Hash.new{[]}
Hash.new{{h,k}h[k]=[]}
是不同的。看&