2014-10-06 1 views
0

여러 개의 해시 (제품 정보)가 포함 된 두 개의 해시가 있습니다.~ 25000 개의 해시가 포함 된 두 개의 해시를 비교하려면 어떻게해야합니까?

두 해시를 비교하고 추가, 삭제, 업데이트 된 제품 (예 : 가격, 설명, 이미지)을 확인하고 싶습니다.

old_hash.size 
# => 24595 

new_hash.size 
# => 26153 

다음은 두 해시 구조의 모양 내용은 다음과 같습니다

{"wi230075"=> 
    {"itemId"=>"wi230075", 
    "description"=>"AH Verse frietaardappelen", 
    "salesUnitSize"=>"2,5 kg", 
    "images"=>[...] 
    "fromPrice"=>2.19, 
    "basePrice"=>{"price"=>2.19, "unitPriceDescription"=>"0.96/KG"}, 
    "score"=>0, 
    "frozen"=>false, 
    "isPBO"=>false, 
    "outOfStock"=>false, 
    "quantity"=>0, 
    "extendedAttributes"=>[], 
    "sourceId"=>{"source"=>"wi", "id"=>230075, "asString"=>"wi230075"}, 
    "hqIdSource"=>"AH_HQ", 
    "hqId"=>822729, 
    "productId"=>230075, 
    "links"=>[], 
    "category"=>"/Aardappel, groente, fruit/Aardappelen/Hele aardappel/", 
    "brand"=>"AH"}, 
    {...} 
} 

나는 HashDiff gem를 사용하여 두 해시를 비교하는 시도했습니다. 여기에 내가 무엇을 얻을 수 있습니다 :

diff = HashDiff.diff(old_hash, new_hash) 
diff.size 
# => 64378 

뭔가 잘못되고있는 것, 64378 변경 될 수 없습니다.

두 해시를 비교하는 더 좋은 방법은 무엇입니까?

편집 : 난 그냥 제품을 삭제하거나 수정, 추가되었다 있는지 알고 싶습니다

. 그렇다면 간단한 true이면 충분합니다.

+1

그 보석은 어떤 내부 해시를 비교할 것인가에 대해 알지 못합니다. 그 이유는 모든 것이 출력물에서 다르게 보입니다. – squiguy

+1

왜 '64378' 차이가 나올 수 없다고 생각합니까? 하나의 새로운 최상위 요소는 'N'패치를 생성합니다. 여기서 'N'은 하위 키의 양입니다. 문서를 자세히 살펴보십시오. – mudasobwa

+3

이것은 아마도 데이터베이스를 사용하여 수행해야합니다. 그들은 이런 종류의 문제에 정말로 능숙합니다. –

답변

2

변경된 모든 키가 반환됩니다 (예 :) 작성, 삭제 또는 업데이트 : 이것은 가정

keys = (old_hash.keys | new_hash.keys) 
new_keys = keys.select { |k| old_hash[k].nil? } 
deleted_keys = keys.select { |k| new_hash[k].nil? } 
modified_keys = keys.select { |k| old_hash[k] != new_hash[k] } 
unchanged_keys = keys - (new_keys | deleted_keys | modified_keys) 

당신이 전무 값으로 키에 관심이있어 :

(old_hash.keys | new_hash.keys).select { |k| old_hash[k] != new_hash[k] } 

당신이 뭔가를 할 수있는 특정을 얻을 수 있습니다. 그렇다면 .nil을 분명히 대체해야합니까? 다른 것을 요구하십시오.

1

나는 코드를 테스트하지 않은,하지만 난이 추가 된 레코드를 얻으려면이

과 같은 생각 :

removed_keys = old_hash.keys - new_hash.keys 
removed_records = old_hash.select{|k,v| removed_keys.include? k} 

사람 :

added_keys = new_hash.keys - old_hash.keys 
added_records = new_hash.select{|k,v| added_keys.include? k} 

이 제거 된 기록을 얻으려면을 변경된 기록을 얻으십시오 :

changed_records = new_hash.select do |k,v| 
    old_hash.has_key?(k) && (old_hash[k]["description"] != new_hash[k]["description"] || old_hash[k]["images"] != new_hash[k]["images"] || old_hash[k]["basePrice"] != new_hash[k]["basePrice"]) 
end 
관련 문제