将字符串数组转换为键值对

时间:2014-10-29 17:29:26

标签: ruby arrays hash

我有一个数组作为哈希的值:

:params=>[":centre_id", ":id"]

我试图找到一种方法将数组的每个元素转换为这样的东西:

:centre_id => 1
:id => 1

我尝试了许多不同的方法,但我似乎无法找到一个很好的干净方法:

"#{route[:params].map {|x| x.parameterize.underscore.to_sym => '1'}}"

这就是我想要实现的目标:

-{"controller"=>"venues", "action"=>"activity, {:centre_id=>1, :id=>1}"}
+{"controller"=>"venues", "action"=>"activity", "centre_id"=>"1", "id"=>"1"} << this one

    string or symbol doesn't matter does it?

使用此:

expect(route[:request_method] => route[:path]).to route_to "#{route[:controller]}##{route[:action]}, #{Hash[route[:params].map {|x| [x.sub(/\A:/,'').to_sym, 1] }]}" 

非常感谢帮助。

2 个答案:

答案 0 :(得分:4)

执行以下操作: -

Ruby 2.1或更高版本,使用如下: -

route[:params].map {|x| [x.sub(/\A:/,'').to_sym, 1] }.to_h
# => {:centre_id => 1, :id => 1}

Ruby 2.0或更低版本,请在下面使用: -

Hash[route[:params].map {|x| [x.sub(/\A:/,'').to_sym, 1] }]
# => {:centre_id => 1, :id => 1}

答案 1 :(得分:1)

如果

h = { :params=>[":centre_id", ":id"], :animals=>[":dog", ":cat", ":pig"] }

以下其中一项可能会有所帮助:

h.merge(h) { |_,v,_| Hash[v.map { |s| [s[1..-1].to_sym,1] }] }
  #=> {:params=>{:centre_id=>1, :id=>1}, :animals=>{:dog=>1, :cat=>1, :pig=>1}}

Hash[h.keys.map { |k| h.delete(k).map { |s| [s[1..-1].to_sym,1] } }.flatten(1)]
  #=> {:centre_id=>1, :id=>1, :dog=>1, :cat=>1, :pig=>1}

第二个修改h。如果您不希望这种情况发生,则首先需要h.dup

如果a是一个数组,则可以使用Ruby 2.1 +将Hash[a]替换为a.to_h