【问题标题】:How to loop Ruby hash and remember/access previous value?如何循环 Ruby 哈希并记住/访问以前的值?
【发布时间】:2014-09-22 10:23:18
【问题描述】:

我在控制器中有一个按日历周映射订单数量的哈希:

@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

如何做到这一点?

【问题讨论】:

  • 那不是有效的 Ruby 代码。
  • @sawa 它是有效的 HAML。
  • @p11y 第一个甚至不是 HAML。此外,该标签仅提及 ruby​​。
  • @sawa 我觉得你在这里有点挑剔。哈希只是示例数据,您是否愿意看到没有上下文的神秘控制器操作?我认为这是正确的做法。 HAML 非常清晰,并将其转换为 Ruby,您必须添加 puts 或其他内容以使其成为合理的示例。
  • @p11y:如果 OP 要求某人为他做他的工作,甚至没有得到报酬(让我们面对现实吧,这就是 所做的),这是礼貌的接受几秒钟的时间来正确格式化他的代码,以便可以复制、粘贴和测试它,而不必弄清楚他在谈论什么数据结构,也不必安装甚至与问题无关的其他库。

标签: ruby loops hashmap haml


【解决方案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

【讨论】:

    【解决方案2】:

    试试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) 的第一个值;否则,它将从第二周开始。

    【讨论】:

      【解决方案3】:

      另一种方式:

      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 通过中断循环来处理异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-09
        • 1970-01-01
        • 2012-03-05
        • 1970-01-01
        • 2017-07-08
        • 2012-01-11
        • 2011-08-26
        • 2018-09-19
        相关资源
        最近更新 更多