рубиновый вложенный хэш - PullRequest
0 голосов
/ 08 августа 2011

привет, я получаю данные из базы данных для создания графиков.Я получаю обратно ~ 6000 + записей, с которыми у всех есть Type, Data, Month.Я хотел бы объединить их все в одну структуру данных, чтобы я мог использовать природу Хэшей, состоящую из двух одинаковых ключей, для объединения данных.

Пример: у меня выводится как ..

'Component', 4.1167, 'June'
'Component', 3.2167, 'June'
'Component', 4.8667, 'June'
'Component', 3.3833, 'June'

Я хочу создать вложенный хэш, который выглядит следующим образом:

{'Component' => {'June' => '15.5834'}} #where all of the data gets added

Данные возвращаются в мою программу в виде 3 параллельных массивов.

Таким образом, я могу пройти через вседанные, накапливают их и позволяют природе хэша удалять дубликаты для моих ярлыков.

Возможно ли это как-нибудь?

Спасибо Охотнику

Ответы [ 2 ]

2 голосов
/ 08 августа 2011

Если ваши отдельные позиции сами по себе имеют хеш-подобные объекты с именами столбцов, какими они были бы, если бы они были экземплярами ActiveRecord, то следующий код объединит их в желаемый конечный хеш.Это отдельный пример.

@result = {}
def f x
  @result.merge!({ x[:c] => { x[:m] => x[:v] }}) do |k, o, n|
    o.merge!(n) do |k, o, n|
      o + n
    end
  end
end

f :c => 'Component', :v => 4.1167, :m => 'June'
f :c => 'Component', :v => 3.2167, :m => 'June'
f :c => 'Component', :v => 4.8667, :m => 'June'
f :c => 'Component', :v => 3.3833, :m => 'June'

p @result

Обновление: Ага, параллельные массивы?Ну, вы можете просто изменить вызовы слияния на:

f :c => components[i], :v => values[i], :m => months[i]
2 голосов
/ 08 августа 2011

В зависимости от того, как вы получаете данные из базы данных, вы будете искать что-то похожее на это ...

my_hash = {}
a1, a2, a3 = get_database_result #whatever you call here
a1.each_with_index do |component,i|
  month = a3[i]
  val = a2[i]
  month_hash = my_hash[component] #get the month has for the component
  if month_hash.nil? #if it doesn't exist, create it
    month_hash = {}
    my_hash[component] = month_hash
  end
  num_val = month_hash[month].nil? ? 0 : month_hash[month] #find the existing numeric value or create a zero
  num_val += val #increment by database value
  month_hash[month] = num_val #insert the value
end
my_hash #return my_hash
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...