【问题标题】:How can I build a hash of hash from Hash of Hash of array in Ruby如何从 Ruby 中的数组哈希值构建哈希值
【发布时间】:2015-02-27 13:25:59
【问题描述】:

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

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

它的结构就像elementname有两种idsmacidwinid

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

【问题讨论】:

  • 也许你应该描述你需要获取的哈希的结构。
  • 您能否修改您的问题以包含一些示例数据和一些示例输出?
  • 例如:我有一个哈希叫做common_idscommon_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”} } }
  • 所以,当我尝试获取数据时:common_ids["signin"]["company_txt"] 它给了我 id 的哈希 `{"mac_id"=>nil, "win_id"=>nil}` 我正在尝试做是:当我要执行脚本时,我传递的参数类似于“Mac”或“WIN”。现在我正在构建哈希以将 ID“MAC”或“WIN”之一的值设置为 common_ids["signin"]["company_txt”] 因此,如果我尝试获取 Mac_ids,那么我的新哈希将类似于:common_ids["signin"]["company_txt"] => mac_id value跨度>

标签: ruby hashmap


【解决方案1】:

这应该可以工作

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)在该数组的第二个条目(键值对的值部分)上调用map,它首先得到

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

返回

["company_txt", "mac_id_1"]

然后就可以了

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

返回

["username_txtbx", "mac_id_2"]

这个内图的结果是

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

对此调用 Hash[...] 给出

{"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 的其他顶级元素将去哪里。

对此调用 Hash[...] 给出

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

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

希望这个解释会有所帮助。

【讨论】:

  • is Hash[] 部分包含我们需要定义的map方法。由于我是 ruby​​ 的初学者,请您指导我完成它。
  • 我无法创建您建议的 Hash[ ] 部分。你能指导我吗?
  • 你不能创建它是什么意思?这就像调用一个方法但带有方括号。你能提供更多细节吗?
  • 我是这样做的:common_ids = common_ids.map {|k,v| [k.to_s, v]} 当我使用上面的代码时,我将所有键的所有值都设为 nil。下面是输出:{"signin"=> {"company_txt"=>nil, "username_txtbx"=>nil}}
  • Hash[...] 不是数据结构,它是 Hash 类的静态方法,作用类似于数组索引
猜你喜欢
  • 2016-03-07
  • 2011-04-20
  • 2020-10-09
  • 2013-02-13
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2011-01-15
  • 2016-06-27
相关资源
最近更新 更多