Проблема с методом Ruby Inject - PullRequest
2 голосов
/ 21 ноября 2010

У меня есть массив 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, на [[созданный_кат, usd_conv (общее число за это время)]]

Любые мастера тамзнаете, как это сделать?

Ответы [ 3 ]

3 голосов
/ 21 ноября 2010

Предполагая, что вам нужно "для каждого отдельного 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
    
0 голосов
/ 23 ноября 2010

Это не типичное применение метода inject (reduce). Идея в том, чтобы использовать его, пока вы уменьшаете массив до единого значения. Использование inject поверх других итераторов позволяет вам не определять локальную переменную явно (что хорошо, если у вас есть функциональный подход). Что вам действительно нужно, так это сочетание map и inject - использование массива значений, переданных в аккумулятор, на мой взгляд, подвох;)

Поскольку не существует специального метода для таких действий, я бы придерживался map (или map!):

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

Нижняя сторона загромождает область более высокого уровня аккумулятором.

Версия, использующая map, кажется, в 2-3 раза быстрее, когда тестируется (map против map! версия).

0 голосов
/ 21 ноября 2010
array.collect!{|e| [e.created_at, e.usd_conv]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...