我有以下内容:
lumpy_hash = { 1 => ["A", "B"] }
然后如果我在这个哈希上调用Hash#invert
,我想得到:
lumpy_hash = {"A" => 1, "B" => 1}
我不能使用Hash#invert
来解决这个问题。这样做的任何想法?我不确定是否应该尝试Hash#map
或Hash#invert
。
答案 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
,每个键值对的值等于哈希的默认值。它只是通过计算哈希没有的密钥值来添加对!