cchan23
cchan23

Reputation: 23

Iterate an array of hashes

I have a hash with a key of cities and the value is an array of hashes containing location data. It looks like this:

@locations = {
    "cities"=>[
        {"longitude"=>-77.2497049, "latitude"=>38.6581722, "country"=>"United States", "city"=>"Woodbridge, VA"}, 
        {"longitude"=>-122.697236, "latitude"=>58.8050174, "country"=>"Canada", "city"=>"Fort Nelson, BC"}, 
  ... 
    ]
}

I'd like to iterate through and print all the values for the key city:

Woodbridge, VA
Fort Nelson, BC
...

Upvotes: 0

Views: 1677

Answers (3)

Pramod Solanky
Pramod Solanky

Reputation: 1700

As suggested by others, you have to do the exact same thing but let me explain whats happening in there.

Your example is an array and has multiple elements which could be just string like cities or an array of hashes like you mentioned.

So in order to iterate through the hashes and get the city values printed, you first of all have to access the array that has hashes. By doing so

  @locations["cities"]
  => [{"longitude"=>-77.2497049, "latitude"=>38.6581722, "country"=>"United States", "city"=>"Woodbridge, VA"}, {"longitude"=>-122.697236, "latitude"=>58.8050174, "country"=>"Canada", "city"=>"Fort Nelson, BC"}]

Now that you have go the array you required, you can just integrate through them and get the result printed like this

 @locations["cities"].map{|hash| p hash['city']}

In case your getting nil errors as you have stated in comments, just see what happens when you try to access the array of hashes. if you still are experiencing issues, then you may have to provide the full input so as to understand where the problem is.

Upvotes: 0

Cary Swoveland
Cary Swoveland

Reputation: 110755

For your corrected data format:

@locations = { "cities"=>[
               { "longitude"=>-77.2497049,
                 "latitude"=>38.6581722,
                 "country"=>"United States",
                 "city"=>"Woodbridge, VA"},
               { "longitude"=>-122.697236,
                 "latitude"=>58.8050174,
                 "country"=>"Canada",
                 "city"=>"Fort Nelson, BC" }] }

@locations["cities"].each { |h| puts h["city"] }
Woodbridge, VA
Fort Nelson, BC

or to save in an array:

@locations["cities"].each_with_object([]) { |h,a| a << h["city"] }
  #=> ["Woodbridge, VA", "Fort Nelson, BC"]

Upvotes: 0

ch4nd4n
ch4nd4n

Reputation: 4197

I can't say why would you have that structure, anyway, in the data format you have above, you would access it like

@locations[1].each { |c| p c["city"] }

Although, this implies that you should always expect second object in the array to be the required cities array. Further you need to put in required nil check.

Upvotes: 1

Related Questions