如何将数组的每个第二个元素转换为哈希值

时间:2018-02-15 12:17:34

标签: ruby

我有一个字符串:

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]

然后我卡住了。有人可以帮忙吗?

4 个答案:

答案 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}