反转哈希:从数组中创建多个哈希键

时间:2015-04-24 02:37:14

标签: ruby arrays hash

我正在尝试获取一个反转值的数组的哈希值,以便键现在是值。从这样的表达式:

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}

我也试图对密钥进行修改,但我觉得在我正确找出这个反转问题后,我能够(希望?)找出下行逻辑。

2 个答案:

答案 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}