如何在ruby中构建基于字符串的哈希?

时间:2015-05-15 17:03:49

标签: ruby

示例 -

String1: "{t: 1},{t2: 2}"
String2: "{s: 1},{s2: 2}"

构建一个返回

的哈希数组
[ 
  {t: 1},
  {t2: 2},
  {s: 1},
  {s2: 2}
]

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,那就是我们得到的。