如何在ruby中基于字符串构建哈希?
示例-如何在ruby中基于字符串构建哈希?,ruby,Ruby,示例- String1: "{t: 1},{t2: 2}" String2: "{s: 1},{s2: 2}" 构建一个哈希数组,返回 [ {t: 1}, {t2: 2}, {s: 1}, {s2: 2} ] 正如@mudasobwa所说,您所期望的是无效的 但您可以做的是将其转换为散列的数组: a = "{t: 1},{t2: 2}" #=> "{t: 1},{t2: 2}" b = "{s: 1},{s2: 2}" #=> "{s: 1},{s2: 2}"
String1: "{t: 1},{t2: 2}"
String2: "{s: 1},{s2: 2}"
构建一个哈希数组,返回
[
{t: 1},
{t2: 2},
{s: 1},
{s2: 2}
]
正如@mudasobwa所说,您所期望的是无效的 但您可以做的是将其转换为散列的数组:
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}]
如果给您一个哈希:
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>
map
将c
的两个元素映射到一个哈希:
k,v = "{t: 1}".scan(/\w+/)
#=> ["t", "1"]
{ k.to_sym=>v }
#=> {:t=>"1"}
及
enum
的第二个也是最后一个元素现在被传递到块:
s = enum.next
#=> "{t: 1},{t2: 2}"
c = s.split(',')
#=> ["{t: 1}", "{t2: 2}"]
s = enum.next
#=> "{s: 1},{s2: 2}"
重复上述步骤以获得两个哈希值{:s=>1}
和{:s2=>2}
。由于我们正在使用,我们获得:
[{:t=>"1"}, {:t2=>"2"}, {:s=>"1"}, {:s2=>"2"}]
而不是:
[[{:t=>"1"}, {:t2=>"2"}], [{:s=>"1"}, {:s2=>"2"}]]
如果我们使用了它,我们就会得到它 您期望的结果不是ruby中的有效散列。同意,可能是像下面的朋友一样的散列数组主动假设为什么要匆忙选择答案?当你在发布问题后仅仅30分钟就勾选了答案,而当时只有一个答案时,我和其他人可能还在研究答案。你需要编辑你的问题以展示有效的Ruby对象。如果你不这样做,它肯定会招致否决票和结束投票。你可以在我的答案中看到我假设这些对象是什么。虽然eval似乎不能很好地处理字符串有多个键时到散列的转换,例如:a=“{t:1,t2:2}”@user3087106为什么
eval“{t:1,t2:2}”#=>{t=>1,t2=>2}
很抱歉,上面的解决方案无法处理多个键+多个哈希。。。但我想你们给了我我需要的,关于如何将字符串转换成散列的答案,以及我应该如何合并它们的线索。。。谢谢你,伙计,安德烈,对不起,我不知道。
[[{:t=>"1"}, {:t2=>"2"}], [{:s=>"1"}, {:s2=>"2"}]]