ruby - 用数组值反转散列

标签 ruby

为了便于创作,我这样写我的散列:

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

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

h = Hash[*{
    :key1: [:val1, :val2, :val3],
    :key2: [:val4, :val5, :val6]
}.map {|key, vals| vals.map {|val| [val, key]}}.flatten]

这给了我想要的:

{ :val1 => :key1, :val2 => key1, :val3 => key1, :val4 => key2, :val5 => :key2, :val6 => :key2 }

但是否有更简单的方法来实现相同的目标?

最佳答案

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}

关于ruby - 用数组值反转散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17523934/

相关文章:

ruby-on-rails - ActiveAdmin 错误 : no superclass method `buttons'

ruby-on-rails - 如何修复 Rails 安装错误?

ruby-on-rails - self.included——包含来自 Ruby 模块的类方法

ruby - 如何使用 Yard 记录继承的构造函数

ruby - 时间戳最近午夜的时间戳

ruby-on-rails - 在方法末尾返回 nil 或 bool 值是否比让 Ruby 返回最后一行代码的结果更高效?

mysql - 如何在 MySQL 中返回未找到值的列表

ruby - rake rspec 测试未运行

ruby-on-rails - 使用 RSpec 测试模块内部的类

ruby - 在没有 RVM 的情况下更改 Ruby 路径