我需要像这样转换一个数组:
codes = ["AAAA 2.0", "BBBB 1.0", "CCCC n/a", "DDDD"]
成这样的哈希:
codes = {
"AAAA" => "2.0",
"BBBB" => "1.0",
"CCCC" => "n/a",
"DDDD" => ""
}
有任何想法如何处理这个最佳方式?
答案 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"=>""}