ruby嵌套哈希创建

时间:2011-08-08 16:53:05

标签: ruby key-value nested

嗨,我从数据库中获取数据以创建一些图表。我正在回复~6000 +条目,所有条目都与Type, Data, Month相关联。我想将这些全部组合成一个数据结构,以便我可以利用没有重复键的哈希性质 合并数据。

示例:我的输出类似..

'Component', 4.1167, 'June'
'Component', 3.2167, 'June'
'Component', 4.8667, 'June'
'Component', 3.3833, 'June'

我想制作一个看起来像这样的嵌套哈希:

{'Component' => {'June' => '15.5834'}} #where all of the data gets added

数据作为3个并行数组返回到我的程序。

这样我就可以遍历所有数据,累积它并允许哈希的性质去除我的标签的重复项。

这有可能吗?

由于 亨特

2 个答案:

答案 0 :(得分:2)

根据您从数据库中获取数据的方式,您将看到类似于此的内容......

my_hash = {}
a1, a2, a3 = get_database_result #whatever you call here
a1.each_with_index do |component,i|
  month = a3[i]
  val = a2[i]
  month_hash = my_hash[component] #get the month has for the component
  if month_hash.nil? #if it doesn't exist, create it
    month_hash = {}
    my_hash[component] = month_hash
  end
  num_val = month_hash[month].nil? ? 0 : month_hash[month] #find the existing numeric value or create a zero
  num_val += val #increment by database value
  month_hash[month] = num_val #insert the value
end
my_hash #return my_hash

答案 1 :(得分:2)

如果您的单个订单项本身就是类似哈希的对象,并且它们是ActiveRecord实例,那么下面的代码会将它们合并到您想要的最终哈希值中。这是一个独立的例子。

@result = {}
def f x
  @result.merge!({ x[:c] => { x[:m] => x[:v] }}) do |k, o, n|
    o.merge!(n) do |k, o, n|
      o + n
    end
  end
end

f :c => 'Component', :v => 4.1167, :m => 'June'
f :c => 'Component', :v => 3.2167, :m => 'June'
f :c => 'Component', :v => 4.8667, :m => 'June'
f :c => 'Component', :v => 3.3833, :m => 'June'

p @result

更新:啊哈,并行数组?好吧,您可以将合并调用更改为:

f :c => components[i], :v => values[i], :m => months[i]