将哈希值(即数组)反转为新的单独键

Ton*_*tto 0 ruby hash

我有以下内容:

lumpy_hash = { 1 => ["A", "B"] }
Run Code Online (Sandbox Code Playgroud)

那么如果我调用Hash#invert这个哈希,我想得到:

lumpy_hash = {"A" => 1, "B" => 1}
Run Code Online (Sandbox Code Playgroud)

我没有从使用中得到这一点Hash#invert。这样做有什么想法吗?我不确定我是否应该尝试Hash#mapHash#invert

Car*_*and 5

有很多方法可以做到这一点。这是一个:

Hash[lumpy_hash.map { |k,v| v.product([k]) }.first]
 #=> {"A"=>1, "B"=>1} 
Run Code Online (Sandbox Code Playgroud)

我认为Hash#invert方法在这里没有用。

步骤:

enum = lumpy_hash.map
  #=> #<Enumerator: {1=>["A", "B"]}:map> 
k,v = enum.next
  #=> [1, ["A", "B"]] 
k #=> 1 
v #=> ["A", "B"] 
a = v.product([k])
  #=> ["A", "B"].product([1])
  #=> [["A", 1], ["B", 1]] 
Hash[a]
  #=> {"A"=>1, "B"=>1}
Run Code Online (Sandbox Code Playgroud)

这是使用哈希默认值的另一种方法。这个比较有趣:

key,value = lumpy_hash.to_a.first
  #=> [1, ["A","B"]]
Hash.new { |h,k| h[k]=key }.tap { |h| h.values_at(*value) }
  #=> {"A"=>1,"B"=>1}
Run Code Online (Sandbox Code Playgroud)

Object#tap将一个空哈希传递给它的块,并将其分配给块变量h。该块h在添加三个键值对后返回,每个键值对的值等于哈希的默认值。它仅通过计算哈希不具有的键的值来添加对!