我正在尝试获取一个反转值的数组的哈希值,以便键现在是值。从这样的表达式:
StackOverflow.transform({ 1 => ['A', 'E'] , 2 => ["B"]})
我正试图得到这个结果:
{"A"=>1, "E"=>1, "B"=>2}
我有这个:
class StackOverflow
def self.transform(old)
a = Hash[old.map { |k,v| v.product([k]) }.first]
end
end
但键都被分隔为单独的键(未分组)。它返回:
{"A"=>1, "E"=>1}
我也试图对密钥进行修改,但我觉得在我正确找出这个反转问题后,我能够(希望?)找出下行逻辑。
答案 0 :(得分:4)
你非常接近。您想使用flat_map
代替first
。
class StackOverflow
def self.transform(old)
Hash[old.flat_map { |k,v| v.product([k]) }]
end
end
您正在使用first
展平数组。
答案 1 :(得分:0)
另一种方式:
class StackOverflow
def self.transform(old)
val = nil
old.each_with_object(Hash.new { |h,k| h[k]=val }) do |(k,v),h|
val = k
h.values_at(*v)
end
end
end
old = { 1=>['A', 'E'], 2=>['B'] }
StackOverflow.transform(old)
#=> {"A"=>1, "E"=>1, "B"=>2}