如何从 Ruby 中的数组哈希的哈希构建哈希的哈希

How can I build a hash of hash from Hash of Hash of array in Ruby

我有以下数组散列的散列:

Hash["signin"]["elementname"]["ids"]` -- here ids are "macid" and "winid"

它的结构就像elementname有两种ids macidwinid.

在运行时,当我传递一个参数时说 mac 然后我试图从现有的散列构建散列,该散列只有 macid。 因此,我正在尝试转换 Hash["signin"]["elementname"]["ids"].

这应该有效

Hash[common_ids.map { |a|
  [a[0], Hash[a[1].map { |b|
    [b[0], b[1]['mac_id']]
  }]]
}]

您需要执行 Hash[...] 部分,因为哈希上的 map 方法将其转换为键值对数组。

希望该代码对您有用。它在 irb 中对我有用。您可能希望将 a 和 b 变量重命名为更有意义的名称。

这里有一些解释:

当您在哈希上调用 .map 时,它以 [k, v] 数组的形式提供每个值,它期望块的内容计算为 [k, v] 数组,并且返回结果.map 是 [k, v] 数组的数组。 Hash[...] 用于将数组样式重新转换为散列(参见 http://ruby-doc.org/core-2.1.5/Hash.html#method-c-5B-5D)。

为了

common_ids = {"signin"=> { "company_txt"=>{"mac_id"=> "mac_id_1", "win_id"=> "win_id_1"}, "username_txtbx"=> {"mac_id"=>"mac_id_2", "win_id"=>"win_id_2"} } }

事情是这样的:

第一级块(带参数a)得到

a = ["signin", { "company_txt"=>{"mac_id"=> "mac_id_1", "win_id"=> "win_id_1"}, "username_txtbx"=> {"mac_id"=>"mac_id_2", "win_id"=>"win_id_2"} }]

它使用第二个块(带有参数 b)在该数组的第二个条目(键值对的值部分)上调用映射,它首先获得

b = ["company_txt", {"mac_id"=> "mac_id_1", "win_id"=> "win_id_1"}]

它returns

["company_txt", "mac_id_1"]

然后得到

b = ["username_txtbx", {"mac_id"=>"mac_id_2", "win_id"=>"win_id_2"}]

它returns

["username_txtbx", "mac_id_2"]

这个内映射的结果是

[["company_txt", "mac_id_1"], ["username_txtbx", "mac_id_2"]]

在此调用哈希[...]得到

{"company_txt" => "mac_id_1", "username_txtbx" => "mac_id_2"}

然后将其作为外部地图数组的第二个元素给出,结果为

["signin", {"company_txt" => "mac_id_1", "username_txtbx" => "mac_id_2"}]

如果您有 common_ids 的第二个顶级元素,它会导致相同的处理。当外部地图调用完成时,您有

[["signin", {"company_txt" => "mac_id_1", "username_txtbx" => "mac_id_2"}], ...]

其中 ... 表示 common_ids 的其他顶级元素所在的位置。

在此调用哈希[...]得到

{"signin" => {"company_txt" => "mac_id_1", "username_txtbx" => "mac_id_2"}, ...}

其中 ... 代表 k => v 形式的任何其他顶级键值对。

希望解释对您有所帮助。