繁体   English   中英

如何在Ruby中使用Hash of Hash of hash构建哈希哈希

[英]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有两种id 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)调用该数组的第二个条目(键值对的值部分)上的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的任何其他顶级键值对。

希望这个解释有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM