我跟随下面的数组哈希哈希:
Hash["signin"]["elementname"]["ids"]` -- here ids are "macid" and "winid"
它的结构就像elementname有两种id macid
和winid
。
在运行时,当我传递一个参数说mac
时,我试图从现有的哈希构建哈希,该哈希只有macid
。
所以,我试图转换Hash["signin"]["elementname"]["ids"]
。
答案 0 :(得分:0)
这应该有效
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]数组的数组。哈希[...]用于将该数组样式转换为哈希值(请参阅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 =>的任何其他顶级键值对。诉
希望这个解释有所帮助。