如何迭代3D哈希

时间:2019-07-16 13:11:37

标签: ruby loops hash

我有一个3D哈希,该哈希是使用yaml文件中的数据生成的。我需要获取每个数组的键并将其连接到它的值,以便将它们显示在表单的选择字段上。

我尝试使用eachfor...inhash.keyshash.valuesmap,但它们将哈希值作为一个而不是分开的值返回

这是哈希的结构:

{
   "AC"=>
       {
         "ACRELANDIA"=>419,
         "ASSIS BRASIL"=>111
       },
    "AL"=>
        {
         "AGUA BRANCA"=>2701,
         "ANADIA"=>2703
        }
}

最后,我希望结果是这样的:

AC - ACRELANDIA: 419

AC - ASSIS BRASIL: 111

...每个城市的依此类推。

3 个答案:

答案 0 :(得分:2)

您可以执行以下操作

hash = {
   "AC"=> { "ACRELANDIA"=>419, "ASSIS BRASIL"=>111 },
   "AL"=> { "AGUA BRANCA"=>2701, "ANADIA"=>2703 }
}

hash.flat_map { |x,y| y.map { |z| "#{x} - #{z[0]}: #{z[1]}" } }

# => ["AC - ACRELANDIA: 419", "AC - ASSIS BRASIL: 111", "AL - AGUA BRANCA: 2701", "AL - ANADIA: 2703"]

答案 1 :(得分:1)

只是出于好奇。适用于任何长度的哈希(假设长度相同)。

hash.
  flat_map { |k, v| [k].product(v.to_a) }.
  map { |e| e.join(' — ') }
#⇒ ["AC — ACRELANDIA — 419",
#   "AC — ASSIS BRASIL — 111",
#   "AL — AGUA BRANCA — 2701",
#   "AL — ANADIA — 2703"]

或:

hash.
  map { |k, v| [k].product(v.to_a) }.
  flatten(1).
  map { |e| e.join(' — ') }

答案 2 :(得分:0)

在这种情况下,我希望使用Enumerable#each_with_object

hash = {
   "AC"=> { "ACRELANDIA"=>419, "ASSIS BRASIL"=>111 },
   "AL"=> { "AGUA BRANCA"=>2701, "ANADIA"=>2703 }
}

arr = hsh.each_with_object([]) {|(key, cities), data| cities.each{|name, i| data << "#{key} - #{name}: #{i}"}}
# => ["AC - ACRELANDIA: 419", "AC - ASSIS BRASIL: 111", "AL - AGUA BRANCA: 2701", "AL - ANADIA: 2703"]