Ruby:如何将字符串数组转换为哈希?

时间:2016-02-23 11:33:22

标签: arrays ruby

我需要像这样转换一个数组:

codes = ["AAAA 2.0", "BBBB 1.0", "CCCC n/a", "DDDD"]

成这样的哈希:

codes = {
  "AAAA" => "2.0",
  "BBBB" => "1.0",
  "CCCC" => "n/a",
  "DDDD" => ""
}

有任何想法如何处理这个最佳方式?

2 个答案:

答案 0 :(得分:8)

hash = {}
codes.each { |a| hash[a.split[0]] = a.split[1].to_s }
hash
#=> {"AAAA"=>"2.0", "BBBB"=>"1.0", "CCCC"=>"n/a", "DDDD"=>""}

或者(如果你"" nil正好):

Hash[codes.map(&:split)]
#=> {"AAAA"=>"2.0", "BBBB"=>"1.0", "CCCC"=>"n/a", "DDDD"=>nil}

答案 1 :(得分:1)

codes.map { |s| s.split(/\s+/).tap { |a| a << "" if a.size==1 } }.to_h
  #=> {"AAAA"=>"2.0", "BBBB"=>"1.0", "CCCC"=>"n/a", "DDDD"=>""}

步骤如下。

codes.map { |s| s.split(/\s+/) }
  #=> [["AAAA", "2.0"], ["BBBB", "1.0"], ["CCCC", "n/a"], ["DDDD"]]

由于我们想将其转换为散列,我想在每个大小为1的数组中附加一个空字符串。Object#tap提供了一种方便的方法:

b = codes.map { |s| s.split(/\s+/).tap { |a| a << "" if a.size==1 } }
  #=> [["AAAA", "2.0"], ["BBBB", "1.0"], ["CCCC", "n/a"], ["DDDD", ""]]

tap获取s.split(/\s+/)的结果,由块变量a表示,如果大小为1则附加""a返回tap,无论是否被改变。最后,

 b.to_h
   #=> {"AAAA"=>"2.0", "BBBB"=>"1.0", "CCCC"=>"n/a", "DDDD"=>""}