Поскольку вы графически отображаете данные, предположительно, с месяцами на оси 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
(хэши), для которых h
имеет ключ m
, и нанесите на график дни в h[m]
, если есть (не «нет данных»).
month_range.each do |m|
data.each do |h|
<plot h[m]> if h.has_key?(m) && h[m].any?
end
end