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

时间:2015-04-22 02:20:25

标签: ruby hash

我有以下内容:

lumpy_hash = { 1 => ["A", "B"] }

然后如果我在这个哈希上调用Hash#invert,我想得到:

lumpy_hash = {"A" => 1, "B" => 1}

我不能使用Hash#invert来解决这个问题。这样做的任何想法?我不确定是否应该尝试Hash#mapHash#invert

1 个答案:

答案 0 :(得分:4)

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

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

我不认为方法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}

这是使用哈希default value的另一种方式。这个很有意思:

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}

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