标准化两个哈希值以包含相同的键

时间:2018-05-14 17:46:42

标签: ruby-on-rails ruby highcharts

我希望在highcharts图中绘制多个系列图。我有以下两个变量

   first = {5 => [dates in here], 6 => [dates in here], etc}
   second = {4 => [dates in here], 5 => [dates in here], etc}

键是与月份相关的数字(4月,4月,5月,5月等)

我遇到的问题是两个哈希值可能并不总是具有相同的月份。因此,当我绘制数据时,第一个[5]绘制在第二个[4]旁边,第一个[6]绘制在第二个[5]旁边等等。

如何标准化这两个变量,使它们始终包含相同的键,即使它看起来像这样:

   first = {4 => [no data], 5 => [dates in here], 6 => [dates in here], etc}
   second = {4 => [dates in here], 5 => [dates in here], 6 => [no data], etc}

3 个答案:

答案 0 :(得分:1)

first_keys = first.keys
second_keys = second.keys
keys = first_keys + second_keys

keys.uniq.each do |key|
  first[key]  = [] if first[key].nil?
  second[key] = [] if second[key].nil?
end

答案 1 :(得分:1)

有很多方法可以做到这一点,因为它是相当开放的,但你可以从两个哈希中创建一个公共keys数组,并迭代将nil分配给该{的哈希值{1}}。我会特意这样做

key

答案 2 :(得分:0)

当您绘制数据时,大概是x轴上的月份和y轴上的天数,我认为最方便的是迭代几个月的时间来提供最小的密钥覆盖(几个月) )包含在两个哈希中。

data = [{ 5=>[3, 5, 11, 24], 6=>[1, 7, 13, 30], 2=>[4, 13, 18, 29] },
        { 4=>[6, 9, 19, 26], 5=>[4, 8, 11, 22], 1=>[1, 19, 22, 24] }]

month_range = Range.new(*data.reduce([]) { |arr, h| arr | h.keys }.minmax)
  #=> 1..6

请注意

a = data.reduce([]) { |arr, h| arr | h.keys }
  #=> [5, 6, 2, 4, 1]
b = a.minmax
  #=> [1, 6]
Range.new(*b)
  #=> Range.new(*[1, 6]) => Range.new(1, 6) => 1..6

我将输入表示为任意数组的哈希值,如果有两个以上的话。

对于图表,只需迭代month_range,然后每个月m迭代h(哈希)data所拥有的元素hm,并在h[m]中绘制天数(如果有的话)(不是"没有数据")。

month_range.each do |m|
  data.each do |h|
    <plot h[m]> if h.has_key?(m) && h[m].any?
  end
end