2014-10-20 88 views
0

我有一個密鑰cities的散列,值是包含位置數據的散列數組。它看起來像這樣:迭代散列數組

@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"}, 
    ... 
    ] 
} 

我想遍歷並打印的所有值的關鍵city

Woodbridge, VA 
Fort Nelson, BC 
... 
+0

感謝編輯塞爾吉奧。我試圖用4個空格縮進「代碼」,但它沒有工作......? – cchan23 2014-10-20 06:13:30

+0

什麼是@地點? – 2014-10-20 06:13:39

+0

四維空間縮進需要在代碼塊周圍留空行。 – 2014-10-20 06:14:13

回答

0

爲了您的修正後的數據格式:

@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 

或數組保存:

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

非常感謝。這個伎倆。我可能會自己來解決這個問題,但是我被原來對數據集的誤讀所拋棄。我已更新原始問題的格式,以便其他人可以參考和使用您的答案。 乾杯 – cchan23 2014-10-20 07:31:52

1

我不能說,爲什麼你有一個結構,無論如何,在你上面的數據格式,你會雖然,這意味着你應該總是期望第二個對象數組中是需要的城市數組訪問它像

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

。此外,您需要輸入必需的無核查。

+0

感謝您的快速響應!我嘗試了你的解決方案,並且我得到了「無定義的方法」,每個'nil:NilClass「。我讀到你說我新加入了一個必要的零支票。也許我沒有那樣做。我會在哪裏檢查零? – cchan23 2014-10-20 06:35:36

+0

有可能您沒有數組中的第二個元素。您可以打印'@ locations'並檢查它是否包含第二個元素。像'p @locations [1]'一樣。你可以將上面的代碼改成'@locations [1] .each {| c | p c [「城市」]}除非@ locations.nil? && @locations [1] .nil?'。上面提到的數據格式對我來說看起來不可靠。 – ch4nd4n 2014-10-20 06:49:27

+0

傻我。我想我錯誤地閱讀了數據結構。你能看到最新的信息嗎?我將數據結構放在原始文章的底部。 – cchan23 2014-10-20 07:07:41

0

正如其他人所建議的,你必須做同樣的事情,但讓我解釋發生了什麼。

你的例子是一個數組,它有多個元素,可能只是像cities這樣的字符串,或者像你提到的散列數組。

所以爲了遍歷散列並獲得打印的城市值,首先必須訪問具有散列的數組。這樣

@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"].map{|hash| p hash['city']} 

如果你獲得零失誤的結果,你已經聲明在評論中,看看當你嘗試訪問哈希數組時會發生什麼。如果您仍然遇到問題,那麼您可能需要提供完整的輸入信息,以便了解問題所在。

+0

感謝您的幫助。我相信你的解決方案會起作用(並且感謝花時間來解釋它!),但我錯誤地閱讀了數據結構......我想。我更新了底部的原始帖子。我想我現在用一個關鍵的「城市」來處理哈希值,並且這個值是一組哈希值。 – cchan23 2014-10-20 07:11:15

+0

那麼,你不必改變太多,只需要獲得密鑰並重復。 – 2014-10-20 07:24:49