迭代一系列哈希

时间:2014-10-20 06:10:38

标签: ruby arrays loops each hash

我有一个密钥为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
...

3 个答案:

答案 0 :(得分:1)

我不能说你为什么会有这种结构,无论如何,你在上面的数据格式中,你会像

那样访问它
@locations[1].each { |c| p c["city"] }

尽管如此,这意味着您应该始终期望数组中的第二个对象是必需的cities数组。此外,您需要进行必要的零检查。

答案 1 :(得分: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']}

如果你在评论中说明了你的nil错误,那么只要看看当你尝试访问哈希数组时会发生什么。如果您仍然遇到问题,那么您可能必须提供完整的输入,以便了解问题所在。

答案 2 :(得分: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"]