我有一个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(那个时间的总数)]来改变这个]]
那里的任何巫师都知道如何做到这一点?
答案 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)
这不是inject
(reduce
)方法的典型应用。想法是在将数组减少为单值时使用它。在这里使用inject
而不是其他迭代器允许你不明确地定义局部变量(如果你有函数方法,这是好的)。你真正需要的是map
和inject
的组合 - 使用累加器中传递的值数组在我看来是肮脏的技巧;)
由于没有专门的方法来做这些事情,我会坚持map
(或map!
):
accumulator = 0
ary.map! {|el| [el.created_at, accumulator += el.usd_conv]}
下行通过累加器使更高级别的范围变得混乱。
使用map
的版本在基准测试(map
vs map!
版本)时的速度似乎要快2-3倍。