如何从 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 macid
和winid
.
在运行时,当我传递一个参数时说 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 形式的任何其他顶级键值对。
希望解释对您有所帮助。
我有以下数组散列的散列:
Hash["signin"]["elementname"]["ids"]` -- here ids are "macid" and "winid"
它的结构就像elementname有两种ids macid
和winid
.
在运行时,当我传递一个参数时说 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 形式的任何其他顶级键值对。
希望解释对您有所帮助。