我有以下内容:
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#map或Hash#invert。
有很多方法可以做到这一点。这是一个:
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在添加三个键值对后返回,每个键值对的值等于哈希的默认值。它仅通过计算哈希不具有的键的值来添加对!
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |