我想這個數組轉換數組的數組與第一個數組的元素哈希作爲重點哈希
[['a', 'b'],['c', 'd'],['e', 'f']]
轉換爲這個哈希
{
"a" : "c",
"b" : "d"
},
{
"a" : "e",
"b" : "f"
}
怎麼辦呢?
我試圖使用group_by
和正常的迭代器,但沒有運氣到目前爲止。有任何想法嗎?
我想這個數組轉換數組的數組與第一個數組的元素哈希作爲重點哈希
[['a', 'b'],['c', 'd'],['e', 'f']]
轉換爲這個哈希
{
"a" : "c",
"b" : "d"
},
{
"a" : "e",
"b" : "f"
}
怎麼辦呢?
我試圖使用group_by
和正常的迭代器,但沒有運氣到目前爲止。有任何想法嗎?
▶ 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] }
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"}]
這種方式更爲靈活。
我會用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)
我會寫:
key = a.shift
p a.map{|x| key.zip(x).to_h } => [{"a"=>"c", "b"=>"d"}, {"a"=>"e", "b"=>"f"}]
請不要快速提供代碼迴應和協助。 –