簡體   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