我有一个3D哈希,该哈希是使用yaml
文件中的数据生成的。我需要获取每个数组的键并将其连接到它的值,以便将它们显示在表单的选择字段上。
我尝试使用each
,for...in
,hash.keys
,hash.values
和map
,但它们将哈希值作为一个而不是分开的值返回
这是哈希的结构:
{
"AC"=>
{
"ACRELANDIA"=>419,
"ASSIS BRASIL"=>111
},
"AL"=>
{
"AGUA BRANCA"=>2701,
"ANADIA"=>2703
}
}
最后,我希望结果是这样的:
AC - ACRELANDIA: 419
AC - ASSIS BRASIL: 111
...每个城市的依此类推。
答案 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"]