示例 -
String1: "{t: 1},{t2: 2}"
String2: "{s: 1},{s2: 2}"
构建一个返回
的哈希数组[
{t: 1},
{t2: 2},
{s: 1},
{s2: 2}
]
答案 0 :(得分:1)
正如@mudasobwa所说,你所期待的是无效的。
但你可以做的是使用eval
将其转换为哈希的数组:
a = "{t: 1},{t2: 2}"
#=> "{t: 1},{t2: 2}"
b = "{s: 1},{s2: 2}"
#=> "{s: 1},{s2: 2}"
[a.split(','), b.split(',')].flatten.map{|a| eval a}
#=> [{:t=>1}, {:t2=>2}, {:s=>1}, {:s2=>2}]
答案 1 :(得分:1)
如果给你哈希:
h = { String1: "{t: 1},{t2: 2}", String2: "{s: 1},{s2: 2}" }
并希望返回一个数组:
[ {t: 1}, {t2: 2}, {s: 1}, {s2: 2} ]
你可以这样做:
h.values.flat_map do |s|
s.split(',').map do |t|
k,v = t.scan(/\w+/)
{ k.to_sym=>v }
end
end
#=> [{:t=>"1"}, {:t2=>"2"}, {:s=>"1"}, {:s2=>"2"}]
步骤:
a = h.values
#=> ["{t: 1},{t2: 2}", "{s: 1},{s2: 2}"]
enum = a.flat_map
#=> #<Enumerator: ["{t: 1},{t2: 2}", "{s: 1},{s2: 2}"]:flat_map>
枚举数的第一个元素传递给块:
s = enum.next
#=> "{t: 1},{t2: 2}"
c = s.split(',')
#=> ["{t: 1}", "{t2: 2}"]
map
将每个c
的两个元素映射到哈希:
k,v = "{t: 1}".scan(/\w+/)
#=> ["t", "1"]
{ k.to_sym=>v }
#=> {:t=>"1"}
和
k,v = "{t2: 2}".scan(/\w+/)
#=> ["t2", "2"]
{ k.to_sym=>v }
#=> {:t2=>"2"}
enum
的第二个也是最后一个元素现在传递给了块:
s = enum.next
#=> "{s: 1},{s2: 2}"
重复上述步骤以获得两个哈希{:s=>1}
和{:s2=>2}
。由于我们使用Enumerable#flat_map,我们获得:
[{:t=>"1"}, {:t2=>"2"}, {:s=>"1"}, {:s2=>"2"}]
而不是:
[[{:t=>"1"}, {:t2=>"2"}], [{:s=>"1"}, {:s2=>"2"}]]
如果我们使用Enumerable#map,那就是我们得到的。