2011-05-08 24 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