2015-01-14 3 views
0

내가 가지고있는 다음과 같은 두 가지 해시 :루비 정렬 해시

db = {"1" => "first_name", "2" => "last_name", "5" => "status", "10" => "city" } 
csv = {"1" => "first_name", "2" => "last_name", "5" => "status", "7" => "address", "10" => "city" } 

내가 DB를 기반으로 CSV를 주문하려면, 및 CSV의 모든 키가 아닌 경우 DB에, 나는 이동할 CSV의 끝에 그들을, 그 결과는 다음과 같을 것입니다 위의 예 있도록 :

{"1" => "first_name", "2" => "last_name", "5" => "status", "10" => "city", "7" => "address" } 

을 키 "7"DB 해시, 우리는 단지 CSV 해시의 말미에 이동되지 않은 때문에 .

이것은 내가 뭘하려 :

db = {"1" => "first_name", "2" => "last_name", "5" => "status", "10" => "city" } 
csv = {"1" => "first_name", "2" => "last_name", "5" => "status", "7" => "address", "10" => "city" } 
rejects = csv.reject {|k| db.include? k } 
result = csv.keep_if {|k,_| db.include? k } 
result.merge!(rejects) 
result 
=> {"1"=>"first_name", "2"=>"last_name", "5"=>"status", "10"=>"city", "7"=>"address"} 

작동하는 것 같다. 하지만 일할 것을 보장합니까? 합병은 항상 두 번째 해시를 끝내겠습니다, 아니면 합병이 해시를 고려하지 않고 해시를 함께 섞을 수있는 가능성이 있습니까?

+0

당신은 db''에 존재하는 csv''에서 키를 재 배열 할 필요가 없습니다? – sawa

+0

@sawa csv에없는 db에있는 키는 csv 끝에 추가해야합니다. db의 키 순서는 중요하지 않지만 모두 csv 해시 끝에 있어야합니다. – Donato

+0

"csv에없는 db에있는 키"에 대해 묻지 않습니다. "CSV에있는 db에있는 키"에 대해 묻고 있습니다. – sawa

답변

1

당신이 할 수있는 다음

db_keys = db.keys 
    #=> ["1", "2", "5", "10"] 
keys = db_keys + (csv.keys-db_keys) 
    #=> ["1", "2", "5", "10", "7"] 
Hash[keys.zip(csv.values_at(*keys))] 
    #=> { "1"=>"first_name", "2"=>"last_name", "5"=>"status", 
    # "10"=>"city", "7"=>"address"}