打破以下数组的最优雅方法是什么
["name:alex", "age:14"]
进入以下哈希:
{:name=>"alex", :age=>"14"}
答案 0 :(得分:7)
在Ruby 2.1数组中附带to_h方法
p ["name:alex", "age:14"].map{|el| el.split(":")}.to_h #=>{"name"=>"alex", "age"=>"14"}
用符号作为键:
["name:alex", "age:14"].map{|el| k,v = el.split(":"); [k.to_sym, v]}.to_h
答案 1 :(得分:6)
您需要拆分每对,并将结果转换为Hash[]
的哈希:
array = ["name:alex", "age:14"]
Hash[array.map { |s| s.split(':') }]
# => {"name"=>"alex", "age"=>"14"}
这利用了Ruby的约定,可以在数组和散列之间自由转换。给定数组[[a, b], [c, d]]
,每个元素都被视为[key, value]
对。您只需将数组从["name:alex", "age:14"]
转换为[['name', 'alex'], ['age', '14']]
,Hash[]
将完成其余工作。相反,您可以在哈希上调用.to_a
并生成包含[[key1, value1], [key2, value2], ...]
的数组。
如果您希望键是符号,可以将其添加到map
:
Hash[array.map { |s| pair = s.split(':'); [pair.first.to_sym, pair.last] }]
答案 2 :(得分:2)
还有一种方法:
a = ["name:alex", "age:14"]
hsh = a.each_with_object({}) do |s,h|
k,v = s.split(":")
h[k.to_sym] = v
end
hsh # => {:name=>"alex", :age=>"14"}
答案 3 :(得分:1)
array = ["name:alex", "age:14"]
array.reduce({}) { |a, e| k, v = e.split(':'); a.merge({k.to_sym => v}) }
# => {:name=>"alex", :age=>"14"}
答案 4 :(得分:0)
我会使用点击和扫描,而不是分号。
a = ["name:alex", "age:14"]
{}.tap { |h| a.each{ |e| e.scan(/(\w+):(\w+)/) { |k, v| h[k.to_sym] = v } } }
# => {:name=>"alex", :age=>"14"}
答案 5 :(得分:0)
试试这个
arr = ["name:alex", "age:14"]
arr.group_by{|str| str.split(":")}.keys.each_with_object({}){|ele, h|
h[ele.first.to_sym] = ele.last}
# => {:name=>"alex", :age=>"14"}