Ruby Inject方法问题

时间:2010-11-21 11:08:10

标签: ruby multidimensional-array

我有一个activerecord数组

 [#<Lead id: 134, address: "24 elm33",created_at: "2010-11-15 12:08:25", updated_at: "2010-11-16 12:53:36", usd_conv: 2741>, 
#<Lead id: 136, address: "guigiu", created_at: "2010-11-17 16:57:45", updated_at: "2010-11-17 16:57:45", usd_conv: 1000>] 

我希望使用inject [[created_at,usd_conv(那个时间的总数)]来改变这个]]

那里的任何巫师都知道如何做到这一点?

3 个答案:

答案 0 :(得分:3)

假设您需要“为每个单独的created_at时间,计算到此时为止所有usd_conv的总和”,这是通过将值逐个注入数据结构来完成的。以下是将记录“注入”双值数组的示例:

  • 第一项累积结果记录
  • 第二个累积当前时刻的总和

    array.inject([0,[]]) do |so_far,elem| 
      so_far[0] += elem.usd_conv
      so_far[1] << [elem.created_at, so_far[0]]
      so_far   # Necessary because block should return the next so_far
    end
    

答案 1 :(得分:0)

array.collect!{|e| [e.created_at, e.usd_conv]}

答案 2 :(得分:0)

这不是injectreduce)方法的典型应用。想法是在将数组减少为单值时使用它。在这里使用inject而不是其他迭代器允许你不明确地定义局部变量(如果你有函数方法,这是好的)。你真正需要的是mapinject的组合 - 使用累加器中传递的值数组在我看来是肮脏的技巧;)

由于没有专门的方法来做这些事情,我会坚持map(或map!):

accumulator = 0
ary.map! {|el| [el.created_at, accumulator += el.usd_conv]}

下行通过累加器使更高级别的范围变得混乱。

使用map的版本在基准测试(map vs map!版本)时的速度似乎要快2-3倍。