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

Я хочу заказать CSV на основе БД, и если есть какие-либо ключи в формате CSV не в БД, то я хочу, чтобы переместить они до конца CSV-файл, так что в приведенном выше примере результат будет выглядеть следующим образом:

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

Поскольку ключ «7» был не в дб хэш, мы просто переместил его к концу 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

Вам не нужно, чтобы изменить порядок ключей в 'csv', которые присутствуют в' db'? – sawa

+0

@sawa ключи, которые находятся в db, которые не находятся в csv, должны быть добавлены в конец csv. Порядок ключей в db не имеет значения, но все они должны быть в конце хэш-памяти csv. – Donato

+0

Я не спрашиваю о «ключах, которые находятся в db, которые не находятся в csv», я спрашиваю о «ключах, которые находятся в db, которые находятся в csv». – 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"} 
Смежные вопросы