Как я могу заполнить хэш массивом значений из другого хеша?
РЕДАКТИРОВАТЬ 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]}