将键值对象的数组转换为键值的对象(r​​uby)

时间:2014-08-26 14:57:01

标签: ruby arrays hash

我有一个具有键属性和值属性的对象列表。

我想将其转换为包含名为带键值的属性的对象。

示例将使其更清晰......

这个

[{
    :key => "key1",
    :value => "value1"
  }, {
    :key => "key2",
    :value => "value2"
}]

应该是这样的:

{
  :key1 => "value1"
  :key2 => "value2"
}

我确定有一条线可以实现 感谢

3 个答案:

答案 0 :(得分:4)

使用Hash::[]Array#map

a = [{
    :key => "key1",
    :value => "value1"
  }, {
    :key => "key2",
    :value => "value2"
}]

Hash[a.map { |h| [h[:key], h[:value]] }]
# => {"key1"=>"value1", "key2"=>"value2"}

Hash[a.map { |h| h.values_at(:key, :value) }]
# => {"key1"=>"value1", "key2"=>"value2"}

Hash[a.map { |h| [h[:key].to_sym, h[:value]] }]
# => {:key1=>"value1", :key2=>"value2"}

a.each_with_object({}) {|h,g| g.update({h[:key].to_sym => h[:value]}) }
# => {:key1=>"value1", :key2=>"value2"}

答案 1 :(得分:1)

Hash[array.map(&:values)]
#=> {"key1"=>"value1", "key2"=>"value2"}

答案 2 :(得分:1)

只是为了推广to_h

[{
    :key => "key1",
    :value => "value1"
  }, {
    :key => "key2",
    :value => "value2"
}].map(&:values).map{|k,v| [k.to_sym,v]}.to_h

# => {:key1=>"value1", :key2=>"value2"}