2014-09-22 47 views
0

我有订单数量按日历周中的控制器映射的哈希:如何循环Ruby哈希并记住/访问以前的值?

@orders_by_week = { 
    "42" => 56, 
    "43" => 64, 
    "44" => 76 
} 

我试图找出如何在一周百分比的相对增长星期会来计算。我在我的HAML鉴于迄今为止得到:

- @orders_by_week.each do |week, orders| 
    = "#{week}: #{orders} (#{ (orders - prev_week_orders/prev_week_orders)*100 }%)" 

,但还没有想出一个办法让prev_week_orders典雅。

这将如何完成?

+3

这是无效的Ruby代码。 – sawa 2014-09-22 10:49:08

+0

@sawa它是有效的HAML。 – 2014-09-22 11:01:29

+1

@ p11y第一个甚至没有HAML。此外,标签只提到红宝石。 – sawa 2014-09-22 11:18:30

回答

1

尝试这种情况:

hash = {'42' => 56, '43' => 64 , '44' => 76} 
all_keys = hash.keys 

hash.each_with_index do |(key,value),index| 
    puts "#{key}: #{value} (#{ (value - hash[all_keys[index-1]]/hash[all_keys[index-1]])*100 }%)" unless index == 0 
end 
1

Enumerable#each_cons尝试:

- @orders_by_week.to_a.unshift([0, 0]).each_cons |(prev_week, prev_week_orders), (week, orders)| 
    = "#{week}: #{orders} (#{ (orders - prev_week_orders/prev_week_orders)*100 }%)" 

to_a.unshift([0, 0])在那里设置第一值(prev_week, prev_orders);否则,它会在第二周开始。

1

另一种方式:

orders_by_week = { "42"=>56,"43"=>64, "44"=>76 } 

pct = [] 
enum = orders_by_week.values.each 
    #=> #<Enumerator: [56, 64, 76]:each> 
loop do 
    orders = enum.next.to_f 
    pct << (100*(enum.peek-orders)/orders).round(2) 
end 
pct 
    #=> [14.29, 18.75] 

Enumerator#peek提出了StopIteration异常与枚举是在年底。 Kernel#loop通过打破循环来处理异常。