2016-05-07 4 views
4

Я использую Google Civic Information API. Это дает мне два массива хешей. Я хочу печатать информацию с экрана. Hash 1 имеет некоторые целые числа в виде пары k-v (officialIndices). Они представляют номер индекса для соответствующего объекта во втором хэше. Как можно объединить эти два? Я хочу отобразить информацию из обоих хэшей вместе. Возможно, было бы лучше заменить значения официальных индексов индексированным хешем во втором массиве. Спасибо за любой совет!Слияние двух хашей

Хэш 1:

{ 
    "name"  => "President of the United States", 
    "divisionId" => "ocd-division/country:us", 
    "levels" => ["country"], 
    "roles" => ["headOfState", "headOfGovernment"], 
    "officialIndices" => [0] 
} 

Хэш 2:

{ 
    "name" => "Barack Obama", 
    "address" => [{ 
    "line1" => "The White House", 
    "line2" => "1600 pennsylvania avenue nw", 
    "city" => "washington", 
    "state" => "DC", 
    "zip" => "20500" 
    }], 
    "party" => "Democratic", 
    "phones" => ["(202) 456-1111"], 
    "urls" => ["http://www.whitehouse.gov/"], 
    "photoUrl" => "http://www.whitehouse.gov/sites/default/files/imagecache/admin_official_lowres/administration-official/ao_image/president_official_portrait_hires.jpg", 
    "channels" => [ 
    { "type" => "GooglePlus", "id" => "+whitehouse" }, 
    { "type" => "Facebook", "id" => "whitehouse" }, 
    { "type" => "Twitter", "id" => "whitehouse" }, 
    { "type" => "YouTube", "id" => "barackobama" } 
    ] 
} 

РЕДАКТИРОВАТЬ ** Чтобы уточнить, Хэш 1 является первым хэш в массив хешей. Хэш 2 - это первый хэш в массиве хэшей. Я хотел бы заменить номер в officialIndice в Hash 1 с Hash 2. Это меня смущает, потому что некоторые официальные индексы имеют более одного номера. Надеюсь, это имеет смысл.

+0

Вы сказали, «Они представляют собой номер индекса для соответствующего объекта в второй хэш ". Что такое «соответствующий объект»? Как этот индекс используется при построении объединенного хэша? Пожалуйста, отредактируйте, чтобы уточнить и показать желаемый объединенный хэш для вашего примера. –

ответ

2

Слияние не будет работать; что вы будете делать, если officialIndices имеет несколько элементов?

array1.each do |el1| 
    el1["officials"] = el1["officialIndices"].map { |idx| 
    array2[idx] 
    } 
    el1.delete("officialIndices") 
end 

(Примечание: это разрушительно, то есть она будет меняться array1 Если вы хотите array1 без изменений, я перепишу.).

+0

СПАСИБО! Это сработало!! –

+1

Я бы предложил 'el1 [" official "] = array2.values_at (* el1 [" officialIndices "])'. Вы были AWOL. –

1

Вы можете использовать Hash#merge для объединения информации из двух хешей. Тем не менее, у вас есть перекрывающийся ключ (name) в обоих, так что вы хотите переименовать его либо хэш до слияния:

# Rename "name" to "position_name" before merging to prevent collision 
hash1["position_name"] = hash1.delete("name") 

merged_hash = hash1.merge(hash2) 
2

Вы можете использовать Hash#merge с блоком:

foo = { "name" => "President of the United States" } 
bar = { "name" => "Barack Obama" } 

foo.merge(bar) { |key, old_val, new_val| {description: old_val, value: new_val} } 
=> {"name"=>{:description=>"President of the United States", 
      :value=>"Barack Obama"}} 

Итак, вы можете указать логику merge таким образом. Это решение эффективно, если у вас более одного перекрывающегося ключа с аналогичной логикой.

+0

Спасибо. Это было бы правдой, но я не был полностью ясен. Хэш 1 - это первый хэш в массиве хешей. Хэш 2 - это первый хэш в массиве хэшей. Я хочу просто объединить информацию из этих двух хэшей. Я могу сделать это, взяв официальный символ и подключив его ко второму массиву. OfficialIndice представляет номер индекса второго хэша. –

Смежные вопросы