我有一个字符串:
string = "a@b@c@d@e@f@g@h@...@z"
我想:
{:a => "b", :c => "d", :e => "f", ...}
首先,我通过执行以下操作来拆分字符串:
array = string.split("@")
# => [a,b,c,d,e,f.....z]
然后我卡住了。有人可以帮忙吗?
答案 0 :(得分:6)
使用each_slice
处理数组中的元素对。
如果数组具有偶数个元素,那么在Enumerator
返回的each_slice
上调用to_h
就足以获得所需的结果:
string.split('@').each_slice(2).to_h
但如果最后一个切片只有一个项目,则上面的to_h
会失败。
一般解决方案使用map
来确保最后一个切片始终包含两个项目(如果需要,第二个切片为nil
),以防止to_h
失败:
string.split('@').each_slice(2).map{|a,b| [a.to_sym, b]}.to_h
答案 1 :(得分:3)
轴心的回答略有改善。
string.split("@").each_slice(2).with_object({}){|(k, v), h| h[k.to_sym] = v}
这不会创建时间数组。
答案 2 :(得分:2)
result_hash = Hash[*string.split("@")]
答案 3 :(得分:2)
这里我从数组中删除z
以生成一个包含奇数元素的数组。
> array = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y"]
> Hash[ array.each_slice( 2 ).map { |e| e } ]
#=> {"a"=>"b", "c"=>"d", "e"=>"f", "g"=>"h", "i"=>"j", "k"=>"l", "m"=>"n", "o"=>"p", "q"=>"r", "s"=>"t", "u"=>"v", "w"=>"x", "y"=>nil}