2016-12-23 4 views
0

поэтому я работаю над проектом, где у меня есть хэш следующим образом:Суммируя вложенных значения индексированного хэша

{ 1=>{:id=>133, 
    :total=>#<BigDecimal:cc08558,'0.41323E3',18(18)>}, 
    2=>{:id=>134, 
     :total=>#<BigDecimal:cc082b0,'0.523E1',18(18)>}, 
    6=>{:id=>166, 
     :total=>#<BigDecimal:cbdbb98,'0.837E2',18(18)>}, 
    8=>{:id=>168, 
     :total=>#<BigDecimal:cbdb8a0,'0.72236E3',18(18)>}, 
    9=>{:id=>169, 
     :total=>#<BigDecimal:cbdb738,'0.132E3',9(18)>} } 

и я хочу, чтобы добавить элемент в этот хэш, который имеет сумму всех общие значения в хеше. С результатом является следующим:

{ 1=>{:id=>133, 
    :total=>#<BigDecimal:cc08558,'0.41323E3',18(18)>}, 
    2=>{:id=>134, 
     :total=>#<BigDecimal:cc082b0,'0.523E1',18(18)>}, 
    6=>{:id=>166, 
     :total=>#<BigDecimal:cbdbb98,'0.837E2',18(18)>}, 
    8=>{:id=>168, 
     :total=>#<BigDecimal:cbdb8a0,'0.72236E3',18(18)>}, 
    9=>{:id=>169, 
     :total=>#<BigDecimal:cbdb738,'0.132E3',9(18)>}, 
    0=>{:id=>000, 
     :total=><whatever the total is>} } 

, но у меня возникают некоторые проблемы с получением этого сделать в данный момент у меня есть:

month_hash.each.sum(:total) 

Но это, кажется, не делать то, что я хочу.

Любая помощь была бы принята с благодарностью.

ответ

0

Вы можете использовать values, чтобы получить все ваши суб-хэшей, и использовать inject перебрать хэшей и суммировать итоги:

sum = h.values.inject(0){|sum,h| sum + h[:total] } 
h[0] = {:id => 0, :total => sum} 

h Сейчас:

{1=>{:id=>133, :total=>413.23}, 
2=>{:id=>134, :total=>5.23}, 
6=>{:id=>166, :total=>83.7}, 
8=>{:id=>168, :total=>722.36}, 
9=>{:id=>169, :total=>132.0}, 
0=>{:id=>0, :total=>1356.52}} 

Обратите внимание, что если вы запустите его снова, вы добавите сумму дважды:

{1=>{:id=>133, :total=>413.23}, 
2=>{:id=>134, :total=>5.23}, 
6=>{:id=>166, :total=>83.7}, 
8=>{:id=>168, :total=>722.36}, 
9=>{:id=>169, :total=>132.0}, 
0=>{:id=>0, :total=>2713.04}} 
Смежные вопросы