Создайте новый хеш, перебирая вложенный хеш - PullRequest
2 голосов
/ 22 августа 2011

Итак, я пытаюсь реорганизовать некоторые данные из API Google Адресов, в настоящее время они получаются из их API следующим образом:

{"results"=> [
             {"geometry"=>{"location"=>{"lat"=>51.503815, "lng"=>-0.11007}}, "icon"=>"http://maps.gstatic.com/mapfiles/place_api/icons/restaurant-71.png", "id"=>"5f212d158f4181db3ac0619fb3c52f36d4e276c2", "name"=>"Madeira Cafe", "reference"=>"CnRjAAAApaZWmTl5wOMtW49q3D1BLKAJ_M8lmZxaD6_-AU92qWfVZdokfTWOzlp5En_r9hSUHx-EeP71hzH7iDPYAGPtiqEAXvT4WcI3xlc5XUivenbQLw0j5MHW-ErL-Hbk4xB_by0OSsXCz9etNgkjbp0QCRIQ82Dgj-I3DAJqr7I3EwsFEhoUm2RXf2rCFlSuhfKjSsPuWKA2VGA",     {"results"=> [{"geometry"=>{"location"=>{"lat"=>51.503815, "lng"=>-0.11007}},
              "icon"=>"http://maps.gstatic.com/mapfiles/place_api/icons/restaurant-71.png",
              "id"=>"11111111",
              "name"=>"Madeira Cafe",
              "reference"=>"xxxxx",
              "types"=>["restaurant", "food", "establishment"],
              "vicinity"=>"London"}]}

Результаты помещаются в хеш с одним ключевым значением - "results"

Остальные данные вложены внутрь (я думаю), где "geometry" является первым в каждой записи.

То, к чему я пытаюсь добраться, - это аккуратный хэш, который имеет один идентификатор на место, с сохранением Lat / Lng и Name ... так что его можно хранить и запрашивать.

Я пробовал что-то вроде этого:

results_hash = {}
result.each do |geometry, location, id|
  results_hash[id] = geometry
end

p results_hash  

но я не могу заставить его работать ... он всегда выводит ноль или просто один и тот же хэш?

Надеюсь, это имеет смысл, как обычно, если кто-то просто скажет: «Прочтите это», это все еще большая помощь.

Спасибо!

Charlie

Ответы [ 3 ]

4 голосов
/ 22 августа 2011

Звучит так, как вы хотите:

results_hash = result["results"].inject({}) { |h, res| h[res["id"]] = res["geometry"]; h }

Это дает вам следующий хеш (напечатанный с awesome_print):

{
    "2d48a3306535b60663645323cdf972c320da8b9d" => {
        "location" => {
            "lng" => -0.114522,
            "lat" => 51.502653
        }
    },
    "5f212d158f4181db3ac0619fb3c52f36d4e276c2" => {
        "location" => {
            "lng" => -0.11007,
            "lat" => 51.503815
        }
    }
}

Возможно, вы захотите слегка отформатировать еголучше:

results_hash = result["results"].inject({}) do |h, res| 
  h[res["id"]] = res["geometry"]
  h
end

Или если вы используете 1.9:

results_hash = result["results"].each_with_object({}) do |res, h| 
  h[res["id"]] = res["geometry"]
end
0 голосов
/ 22 августа 2011

Если вам нужен хэш мест с идентификатором, указывающим на широту, долготу и имя, вы можете сделать что-то вроде этого:

result_hash = {}
hash_from_google["results"].each do |result|
  result_hash[result["id"]] = {
    :name => result["name"], 
    :latitude => result["geometry"]["location"]["lat"],
    :longitude => result["geometry"]["location"]["lng"]
  }
end

Теперь у вас будет результат, который выглядит примерно так:

result_hash["5f212..."] => {:name => "Madeira Cafe", :latitude => 51...., :longitude => -0.1....}

По сути, просто проанализируйте, что вам нужно, из хеша, который вы получаете от API Google Адресов. Если у вас есть проблемы с выяснением того, как настроены данные или что-то в этом роде, попробуйте скопировать их в IRB и поиграть с ними - делая что-то подобное, очень легко выяснить структуру хэша.

0 голосов
/ 22 августа 2011

У вас есть массив хэшей, т.е. [{: geometry => ...,: id => ...}, {: geometry => ...,: id => ...},так далее].Я бы извлек массив, затем перебрал бы каждый элемент в массиве (т.е. каждый элемент в массиве является хешем), используя метод Enumerable # inject , и строил бы новый хеш по ходу.1004 * Что-то в размере:

# locations_array is [{"geometry"=>..., "icon"=>..., "id"=>..., etc}, {"geometry"=>..., "icon"=>..., "id"=>..., etc}, etc]
results_hash = locations_array.inject({}) do |hash, element|
  # extract the id key and the long/lat values
  # store them in the new hash
  hash[element[:id]] = element[:geometry]
  hash
end
...