2017-09-11 53 views
-1

我有散列值的兩個陣列紅寶石:遍歷2個陣列的散列,並創建陣列

  1. rtg連鍵id, position_id, valid_from, valid_to
  2. inv連鍵id, position_id, date

實例是這樣的陣列:

rtg=[{:id=>7, :position_id=>3, :valid_from=>Tue, 05 Sep 2017 10:00:00 EEST +03:00, :valid_to=>Tue, 05 Sep 2017 10:59:59 EEST +03:00}, 
{:id=>6, :position_id=>3, :valid_from=>Mon, 04 Sep 2017 22:00:00 EEST +03:00, :valid_to=>Mon, 04 Sep 2017 23:59:59 EEST +03:00}, 
{:id=>1, :position_id=>2, :valid_from=>Mon, 04 Sep 2017 07:00:00 EEST +03:00, :valid_to=>Mon, 04 Sep 2017 08:00:00 EEST +03:00}] 

inv=[{:id=>23, :position_id=>3, :date=>Tue, 05 Sep 2017 10:10:00 EEST +03:00}, 
{:id=>17, :position_id=>3, :date=>Mon, 04 Sep 2017 22:45:00 EEST +03:00}, 
{:id=>11, :position_id=>3, :date=>Mon, 04 Sep 2017 07:20:00 EEST +03:00}] 

我需要創建數組的數組與來自雙和inv散列其中

1)position_id匹配和

2)從invdate處於valid_from & valid_to憤怒從rtg

我做如何做這個,請嗎?

在我的例子上述結果將是: result = [[7,23],[6,17]]

回答

1

你可以使用嵌套each每個項目在兩個數組比較,抓住id s適合那些符合條件的物品;例如:

rtg.each_with_object([]) do |r, result| 
    inv.each do |i| 
    if i[:position_id] == r[:position_id] && i[:date].between?(r[:valid_from], r[:valid_to]) 
     result << [r[:id], i[:id]] 
    end 
    end 
end 

#=> [[7, 23], [6, 17]] 
+0

謝謝。我調整了@Nimish Gupta回答'find'方法而不是'find_by' +我必須做'庫存[:position_id]'等等,就像你這樣做。你認爲如果我有數千個項目需要迭代,你的代碼可能會有性能提升嗎? – matiss

+0

@matiss因爲你需要比較每個'rtg'項目與每個'inv'(即_O(n^2)_),所以性能會** **(即需要更多時間執行)數組越來越大。 – Gerry

+0

當然,如果數組增長,迭代性能會降低。我在想更多關於'each_with_object'方法。無論如何,你的代碼很好,謝謝! – matiss

1

試試這個

array = [] 
rtg.each do |record| 
    matched_record = inv.find { |inventory| inventory[:position_id] == record[:position_id] && inventory[:date].to_i.in?(record[:valid_from].to_i..record[:valid_to].to_i) } 
    array << [record.id, matched_record.id] if matched_record 
end 

希望這有助於

+0

謝謝你,但是我得到這個錯誤:'NoMethodError:未定義的方法 「find_by」 爲[7,6,1:數組你是什麼意思? min_by' – matiss

+0

我在我的方法名稱不匹配,但我仍然得到這樣的錯誤:'NoMethodError:undefined method「find_by」for#' – matiss

+0

我有一個愚蠢的錯誤,而輸入 它應該是'find ''而不是'find_by' –