使用数组值反转哈希

ICR*_*ICR 8 ruby

为了便于创作,我正在写这样的哈希:

h = {
    :key1: [:val1, :val2, :val3],
    :key2: [:val4, :val5, :val6]
}
Run Code Online (Sandbox Code Playgroud)

但无论我在哪里使用它,我都需要查找与值相关的键.目前我正在做以下改造:

h = Hash[*{
    :key1: [:val1, :val2, :val3],
    :key2: [:val4, :val5, :val6]
}.map {|key, vals| vals.map {|val| [val, key]}}.flatten]
Run Code Online (Sandbox Code Playgroud)

这给了我想要的东西:

{ :val1 => :key1, :val2 => key1, :val3 => key1, :val4 => key2, :val5 => :key2, :val6 => :key2 }
Run Code Online (Sandbox Code Playgroud)

但有没有更简单的方法来实现同一目标?

Chr*_*ald 10

Array#product非常糟糕.:)

h = {
    key1: [:val1, :val2, :val3],
    key2: [:val4, :val5, :val6]
}

p Hash[h.flat_map {|k,v| v.product [k]}]
# {:val1=>:key1, :val2=>:key1, :val3=>:key1, :val4=>:key2, :val5=>:key2, :val6=>:key2}
Run Code Online (Sandbox Code Playgroud)

  • *+ 1*好多了.. :) (2认同)