将数组数组转换为哈希,将第一个数组的元素作为哈希的键

时间:2015-04-23 09:34:35

标签: ruby-on-rails ruby ruby-2.2

我想转换这个数组

[['a', 'b'],['c', 'd'],['e', 'f']] 

到这个哈希

{
  "a" : "c",
  "b" : "d"
},
{
  "a" : "e",
  "b" : "f"
}

怎么做?

我尝试使用group_by和普通迭代器但到目前为止没有运气。有什么想法吗?

5 个答案:

答案 0 :(得分:5)

▶ arr = [[:a, :b],[:c, :d],[:e, :f],[:g, :h]]
▶ key, values = arr.first, arr[1..-1]
▶ values.map { |v| key.zip v }.map &:to_h
#⇒ [
#  [0] {
#    :a => :c,
#    :b => :d
#  },
#  [1] {
#    :a => :e,
#    :b => :f
#  },
#  [2] {
#    :a => :g,
#    :b => :h
#  }
# ]

请注意,与此处提供的其他解决方案不同,此处会将第一个元素作为键映射到任意长度的尾部。

UPD 对于旧版红宝石,没有Array#to_h

values.map { |v| key.zip v }.map { |e| Hash[e] }

答案 1 :(得分:2)

我会使用Array#product

arr = [[:a, :b], [:c, :d], [:e, :f]]

arr.first.product(arr[1..-1]).map(&:to_h)
  #=> [{:a=>:c, :b=>:d}, {:a=>:e, :b=>:f}]

如果可以修改arr,我们可以写:

arr.shift.product(arr).map(&:to_h)

答案 2 :(得分:1)

x = [["a", "b"],["c", "d"],["e", "f"]]
x[1..-1].map { |vs| {x[0][0] => vs[0], x[0][1] => vs[1]} }

像这样。

答案 3 :(得分:1)

a= [['a', 'b'],['c', 'd'],['e', 'f']]

a[1..-1].inject([]) { |sum, s| sum << {a[0][0] => s[0], a[0][1] => s[1]} }

=> [{"a"=>"c", "b"=>"d"}, {"a"=>"e", "b"=>"f"}]

改进:

a= [['a', 'b', 'c'],['d', 'e', 'f'],['g', 'h', 'k']]
a[1..-1].inject([]) do |sum, s|
    hash = {}
    a[0].each_with_index { |it, i| hash.merge!({it => s[i]}) }
    sum << hash
end
=> [{"a"=>"d", "b"=>"e", "c"=>"f"}, {"a"=>"g", "b"=>"h", "c"=>"k"}]

这种方式更灵活。

答案 4 :(得分:1)

我会写:

key = a.shift
p a.map{|x| key.zip(x).to_h } => [{"a"=>"c", "b"=>"d"}, {"a"=>"e", "b"=>"f"}]