Стандартизация двух хэшей для включения одинаковых ключей - PullRequest
0 голосов
/ 14 мая 2018

Я ищу график нескольких рядов в графике старших графиков.У меня есть следующие две переменные

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

Ключи - это число, связанное с месяцами (4, апрель, 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 голосов
/ 14 мая 2018

Есть много способов сделать это, поскольку он довольно открытый, но вы можете создать общий массив keys из двух хешей и выполнить итерацию по этому назначению nil хешу в этом key.Я бы сделал это конкретно так

keys = (first.keys + second.keys).uniq
keys.each do |key|
  first[key] ||= nil
  second[key] ||= nil
end
0 голосов
/ 14 мая 2018

Поскольку вы графически отображаете данные, предположительно, с месяцами на оси 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
0 голосов
/ 14 мая 2018
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...