Задать вопрос
Freika
@Freika
Senior Ruby on Rails developer

Как в Rails получить массив из дат с определенными значениями?

Несколько дней уже бьюсь над задачей, а решить никак не могу.

Суть вопроса:
В наличии массив вида [{"yyyy-mm-dd": 2}, {"yyyy-mm-dd": 6}], то есть содержимым является набор хэшей, у которых даты в качестве ключей и числа в качестве значений.

Что я пытаюсь получить: массив, в котором перечислены все даты за прошедший год (1.year.ago..Date.today) в качестве ключей с значениями из первого массива.

То есть, скажем, первый массив у меня содержит такие данные:
"2014-05-31": 3, "2014-06-01": 5
А второй массив имеет в себе 365 хэшей, ключами в которых являются даты каждого дня в году. Значения подставляются из первого массива и в итоге я должен получить массив вида
"2014-05-29": 0, "2014-05-30": 0, "2014-05-31": 3, "2014-06-01": 5, "2014-06-02": 0
Жирным выделены данные первого массива, подставленные во второй.

Подскажите, пожалуйста, как мне сделать подобное? Я пытался прогонять через if-elsif-else, вложенный в другой if-elsif-else, но получаю в итоге массив дат, в котором записано только последнее значение.

Надеюсь, объяснил достаточно понятно, если нет, постараюсь уточнить, только спросите.
  • Вопрос задан
  • 2748 просмотров
Подписаться 5 Оценить 3 комментария
Решения вопроса 1
@Finist
Не очень красиво, но вроде то что нужно?
a = [{"2014-05-31" => 3}, {"2014-06-01" => 5}]
b = [{"2014-05-29" => 0}, {"2014-05-30" => 0}, {"2014-05-31" => 0}, {"2014-06-01" => 0}, {"2014-06-02" => 0}]
a.each {|c| b.select {|s| s.keys.first == c.keys.first}.first[c.keys.first] = c.values.first}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Vakiliy
@Vakiliy
Можно так:
если в А массиве данные уникальные:
a = [{"yyyy-mm-dd" => 2}, {"yyyy-mm-dd" => 6}]
b = [{"2014-01-01" => 0} ... {"2014-12-31" => 0}]

ah = Hash[*a.map(&:to_a).flatten]
bh = Hash[*b.map(&:to_a).flatten]
result = bh.merge(ah).map{|k,v| {k => v}}


если не уникальные:
ah = {}.tap{ |out| a.each{ |h| h.each{ |k,v| (out[k]||=[]) << v } } }
bh = Hash[*b.map(&:to_a).flatten]
result = bh.merge(ah).map{|k,v| {k => v}}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы