2011-05-08 61 views
2

有了這個哈希:變換2 d散列成1個d散列

{ "blog_namespace" : { "key" : "blog_post_1234", 
         "notice" : "Read the new blog post!" } } 

什麼把它翻譯成散列的最快方法:

{ "blog_post_1234" : "Read the new blog post!" } 

我總是看到人們使用的mapmerge等巧妙組合,但不能完全得到我的頭周圍的方式來做到這一點沒有嵌套兩個循環在一起。

回答

8

這些哈希看起來像是JSON對象。如果是,請使用JSON parser將它們轉換爲紅寶石哈希。

hash = {"blog_namespace" => {"key" => "blog_post_1234", 
          "notice" => "Read the new blog post!"}} 

Hash[hash.map {|k, v| [v["key"], v["notice"]] }] 
# => {"blog_post_1234" => "Read the new blog post!"} 
+0

太容易了!我從來沒有見過構造哈希之前的語法(即哈希[])。有用! :)我可以刪除我的循環,現在感覺更像是一個單獨的Ruby專業版:P – d11wtq 2011-05-08 11:34:23

+0

我剛剛以JSON格式編寫了數據結構,因爲這是數據來自的地方,但我已將其轉換爲使用'來自Rails的ActiveSupport :: JSON'。 – d11wtq 2011-05-08 11:40:19

+0

使用Facets的細微變化:hash.mash {| k,v | [v [「key」],v [「notice」]]} – tokland 2011-05-08 11:57:08

2

這不是一個有效的Ruby散列。但考慮的假設,這是(或者你解析爲一個),而且關鍵將永遠是"blog_namespace",你可以做到以下幾點:

>> Hash[[h["blog_namespace"].values]] 
#=> {"blog_post_1234"=>"Read the new blog post!"} 
+0

對不起,我應該澄清一下,Hash中會有多個條目...... blog_namespace只是衆多命名空間中的一個。但是,謝謝:)(數據從JSON轉換爲Ruby哈希)。 – d11wtq 2011-05-08 11:35:18