2017-09-11 9 views
-1

배열의 배열을 만들 :루비 : 해시의 두 배열을 반복 나는 두 해시의 배열 키 <code>id, position_id, valid_from, valid_to</code><code>id, position_id, date</code></li> </ol> <p>예는 다음과 같이 키</li> <li><code>inv</code>와</p> <ol> <li><code>rtg</code>이

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}] 

1) position_id 일치와 inv에서

2) date 내가 어떻게해야합니까 rtg

에서 valid_from & valid_to의 분노에 rtg에서 id쌍 및 inv 해시와 배열의 배열을 만들려면 이거, 제발? 그 결과 위의 내 예제에서

은 다음과 같습니다 result = [[7,23],[6,17]]

답변

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 

희망을 시도 잡아 조건과 일치하는 항목의 경우 id;

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

감사합니다. 필자는 @imim Gupta가'find_by' 대신에'find' 메소드에 대한 응답을 수정했습니다 + 당신이하는 것처럼'inventory [: position_id]'등을해야했습니다. 반복 할 항목이 수천 가지가 될 경우 코드에서 성능이 향상 될 수 있다고 생각하십니까? – matiss

+0

@matiss'rtg '의 각 항목을'inv' (즉 _O (n^2) _)와 비교할 필요가 있기 때문에, 성능이 ** ** ** 감소합니다 (즉, 실행하는 데 더 많은 시간이 걸립니다). 배열이 커집니다. – Gerry

+0

물론, 배열이 커지면 반복 수행이 줄어 듭니다. 'each_with_object' 메소드에 대해 더 생각하고있었습니다. 어쨌든 코드가 잘 작동합니다. 감사합니다! – matiss

1

, 당신은 두 배열의 각 항목을 비교하는 중첩 된 each를 사용할 수

+0

감사 :하지만이 오류가 발생합니다. 'NoMethodError : undefined method "find_by for [7, 6, 1] : Array 의미하니? min_by' – matiss

+0

내 메소드에서 이름이 일치하지 않지만 여전히 다음과 같은 오류가 발생합니다. 'NoMethodError : undefined method "find_by for # <배열 : 0x007fffe909a498> – matiss

+0

입력하는 동안 바보 같은 실수를했습니다. 'find '대신'find_by' –