2013-07-28 3 views
0

У меня есть несколько массивов (назовем их «оригинальными массивами»). Каждый массив содержит хеши, и внутри каждого хэша у меня есть данные из полученного письма. Например, адрес электронной почты, имя и т. Д. У меня также есть uid, который является уникальным идентификатором полученного письма. Будет много дублирования между оригинальными массивами, и чем больше у массивов, тем лучше (в идеальном мире они должны содержать одни и те же электронные письма и те же данные электронной почты).Объединить массивы хэшей в один массив, а затем сгруппировать все хэши на основе совпадающего идентификатора

ввода пробы:

[[{:from_address=>"[email protected]", 
    :to=>"[email protected]", 
    :subject=>"Some subject regarding order 12198", 
    :datetime=>Sat, 27 Jul 2013 08:48:44 +0000, 
    :uid=>15065, 
    :extraction_strategy=>1, 
    :result=>{:order_id=>"12198", :mail_address=>nil, :name=>"Dr. Evil"}}, 
    {:from_address=>"[email protected]", 
    :to=>"[email protected]", 
    :subject=>"Some subject regarding order 12199", 
    :datetime=>Sat, 27 Jul 2013 08:48:48 +0000, 
    :uid=>15066, 
    :extraction_strategy=>1, 
    :result=>{:order_id=>"12199", :mail_address=>nil, :name=>nil}}], 
[{:from_address=>"[email protected]", 
    :to=>"[email protected]", 
    :subject=>"Some subject regarding order 12197", 
    :datetime=>Sat, 27 Jul 2013 08:22:48 +0000, 
    :uid=>15064, 
    :extraction_strategy=>2, 
    :result=>{:order_id=>"12197", :mail_address=>"[email protected]", :name=>"Batman"}}, 
    {:from_address=>"[email protected]", 
    :to=>"[email protected]", 
    :subject=>"Some subject regarding order 12199", 
    :datetime=>Sat, 27 Jul 2013 08:48:48 +0000, 
    :uid=>15066, 
    :extraction_strategy=>2, 
    :result=>{:order_id=>"12199", :mail_address=>"[email protected]", :name=>"James Bond"}}]] 

Теперь я хочу, чтобы изменить порядок все это так что я получаю один новый массив (назовем его «массив первого уровня»). Внутри массива 1-го уровня я хочу «массивы второго уровня», каждый из которых содержит электронные письма с соответствующими uid. Поэтому, если электронное письмо от одного из исходных массивов имеет тот же uid, что и адрес электронной почты в одном из других исходных массивов, два письма должны быть помещены в один и тот же новый массив второго уровня.

образец Выхода:

[[ 
    [{:from_address=>"[email protected]", 
     :to=>"[email protected]", 
     :subject=>"Some subject regarding order 12197", 
     :datetime=>Sat, 27 Jul 2013 08:22:48 +0000, 
     :uid=>15064, 
     :extraction_strategy=>2, 
     :result=>{:order_id=>"12197", :mail_address=>"[email protected]", :name=>"Batman"}}], 
    [{:from_address=>"[email protected]", 
     :to=>"[email protected]", 
     :subject=>"Some subject regarding order 12198", 
     :datetime=>Sat, 27 Jul 2013 08:48:44 +0000, 
     :uid=>15065, 
     :extraction_strategy=>1, 
     :result=>{:order_id=>"12198", :mail_address=>nil, :name=>"Dr. Evil"}}], 
    [{:from_address=>"[email protected]", 
     :to=>"[email protected]", 
     :subject=>"Some subject regarding order 12199", 
     :datetime=>Sat, 27 Jul 2013 08:48:48 +0000, 
     :uid=>15066, 
     :extraction_strategy=>1, 
     :result=>{:order_id=>"12199", :mail_address=>"[email protected]", :name=>"James Bond"}}, 
    {:from_address=>"[email protected]", 
     :to=>"[email protected]", 
     :subject=>"Some subject regarding order 12199", 
     :datetime=>Sat, 27 Jul 2013 08:48:48 +0000, 
     :uid=>15066, 
     :extraction_strategy=>2, 
     :result=>{:order_id=>"12199", :mail_address=>nil, :name=>nil}}] 
    ]] 

Я могу только придумать решения, что требует много петель и повторения, но как массивы могут получить довольно огромные мне нужен эффективную краткую рутину для этого. Может кто-нибудь мне помочь?

+0

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

ответ

1

хорошо, два вложенных цикл и карта ...

a = [[{:from_address=>"[email protected]", 
     :to=>"[email protected]", 
     :subject=>"Some subject regarding order 12198", 
     :datetime=>"Sat, 27 Jul 2013 08:48:44 +0000", 
     :uid=>15065, 
     :extraction_strategy=>1, 
     :result=>{:order_id=>"12198", :mail_address=>nil, :name=>"Dr. Evil"}}, 
     {:from_address=>"[email protected]", 
     :to=>"[email protected]", 
     :subject=>"Some subject regarding order 12199", 
     :datetime=>"Sat, 27 Jul 2013 08:48:48 +0000", 
     :uid=>15066, 
     :extraction_strategy=>1, 
     :result=>{:order_id=>"12199", :mail_address=>nil, :name=>nil}}], 
    [{:from_address=>"[email protected]", 
     :to=>"[email protected]", 
     :subject=>"Some subject regarding order 12197", 
     :datetime=>"Sat, 27 Jul 2013 08:22:48 +0000", 
     :uid=>15064, 
     :extraction_strategy=>2, 
     :result=>{:order_id=>"12197", :mail_address=>"[email protected]", :name=>"Batman"}}, 
     {:from_address=>"[email protected]", 
     :to=>"[email protected]", 
     :subject=>"Some subject regarding order 12199", 
     :datetime=>"Sat, 27 Jul 2013 08:48:48 +0000", 
     :uid=>15066, 
     :extraction_strategy=>2, 
     :result=>{:order_id=>"12199", :mail_address=>"[email protected]", :name=>"James Bond"}}]] 

     result = Hash.new {|h,k| h[k] = [] } 
     a.each { |b| b.each { |h| result[h[:uid]] << h } } 
     result = result.map { |k, v| v } 

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

+0

Вот почему я люблю Stackoverflow :-) Btw: В моей среде ': datetime' k, v не вызывал проблем. – ChristofferJoergensen

Смежные вопросы