我想分手:
array = [["a", "b", "c"], ["d", "e", "f"], ["g", "h", "i"]]
分成两个哈希:
hash1 = {"a" => "b", "d" => "e", "g" => "h"}
hash2 = {"a" => "c", "d" => "f", "g" => "i"}
有办法做到这一点吗?
答案 0 :(得分:5)
array = [["a", "b", "c"], ["d", "e", "f"], ["g", "h", "i"]]
hash1 = array.map { |f,m,_| [f,m] }.to_h
#=> {"a"=>"b", "d"=>"e", "g"=>"h"}
hash2 = array.map { |f,_,l| [f,l] }.to_h
#=> {"a"=>"c", "d"=>"f", "g"=>"i"}
或
def doit(arr, i1, i2)
arr.map { |a| [a[i1], a[i2]] }.to_h
end
hash1 = doit(array, 0, 1)
#=> {"a"=>"b", "d"=>"e", "g"=>"h"}
hash2 = doit(array, 0, 2)
#=> {"a"=>"c", "d"=>"f", "g"=>"i"}
答案 1 :(得分:3)
一个简单的each
循环可以工作:
array = [["a", "b", "c"], ["d", "e", "f"], ["g", "h", "i"]]
hash1 = {}
hash2 = {}
array.each do |k, v1, v2|
hash1[k] = v1
hash2[k] = v2
end
hash1 #=> {"a"=>"b", "d"=>"e", "g"=>"h"}
hash2 #=> {"a"=>"c", "d"=>"f", "g"=>"i"}
答案 2 :(得分:1)
还有两种方法,尽管第一种方法会破坏你的数组。
首先通过弹出来构建hash2
,以便hash1
变得微不足道:
hash2 = array.map { |a| [a[0], a.pop] }.to_h
hash1 = array.to_h
首先分开键和值列,然后将它们压缩回来:
k, *v = array.transpose
hash1, hash2 = v.map { |v| k.zip(v).to_h }
(感谢Sagar Pandya,我之前使用过k, *v = array.shift.zip(*array)
。)
答案 3 :(得分:0)
array = [["a", "b", "c"], ["d", "e", "f"], ["g", "h", "i"]]
hashes = {}
array.each do |subarray|
subarray[1..-1].each_with_index do |item, index|
hashes[index] ||= {}
hashes[index][subarray.first] = item
end
end
puts hashes.values