Как я могу заполнить хэш массивом значений из другого хеша?

РЕДАКТИРОВАТЬ 2-й вариант для ясности:

У меня есть следующие хэши:

пример ввода ->

hashweek={[43,2011]=>[0,0,0],[44,2011]=>[0,0,0],**[45,2011]=>[0,0,0]**,[1,2012]=>[0,0,0],[2,2012]=>[0,0,0]}
timesRealCum={[43,2011]=>1000,[44,2011]=>1100,[1,2012]=>1200,[2,2012]=>1300}

ожидаемый результат ->

hashweek={[43,2011]=>[1000,0,0],[44,2011]=>[1100,0,0],**[45,2011]=>[1100,0,0]**,[1,2012]=>[1200,0,0],[2,2012]=>[1300,0,0]}

Предполагается, что при выполнении итерации через timesRealCum или hashweek, или любой другой соответствующей методологии, значения hashweek[0] должны быть обновлены, чтобы содержать соответствующие значения из timesRealCum или, если они отсутствуют в хеше timesRealCum, последнее значимое значение.

2 ответа

Решение

Хорошо, этого должно быть достаточно:

timesRealCum.each{|k, v| hashweek[k][0] = v}

Там нет теста для значений ноль, так что если вы ожидаете, что в hashweek отсутствуют ключи, вам придется проверить для hashweek[k] присутствие и hashweek[k][0]:

timesRealCum.each{|k, v| hashweek[k][0] = v if hashweek[k] && hashweek[k][0]}

Изменить: Итак, если я правильно понимаю, если нет записи в timesRealCum, вы хотели бы принять последнее значение, назначенное при циклическом преобразовании в hashweek?

last_v = 0
hashweek.each{|k, v| last_v = v[0] = timesRealCum[k] || last_v }

Теперь этот ниже использовать Inject, чтобы сохранить накопленное значение, если timesRealCum не содержит неделю и год. Теперь он возвращает [1100, 0, 0] для [45, 2011].

hashweek.inject(0) do |mem, kv_pair|
  hashweek[kv_pair.first] = [timesRealCum[kv_pair.first]||mem, kv_pair.last[1..-1]].flatten
  mem = hashweek[kv_pair.first][0]
end

p hashweek
#=> {[43, 2011]=>[1000, 0, 0], [44, 2011]=>[1100, 0, 0], [45, 2011]=>[1100, 0, 0], [1, 2012]=>[1200, 0, 0], [2, 2012]=>[1300, 0, 0]}
Другие вопросы по тегам