将选项数组转换为哈希值

时间:2014-03-19 15:35:41

标签: ruby

打破以下数组的最优雅方法是什么

["name:alex", "age:14"]

进入以下哈希:

{:name=>"alex", :age=>"14"}

6 个答案:

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

使用Enumerable#reduce

的另一种方式
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"}