2011-05-08 9 views
2

에 2 일 해시를 변환 :이 해시 1 D 해시

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

:

{ "blog_namespace" : { "key" : "blog_post_1234", 
         "notice" : "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 pro)와 같은 느낌을 줄 수 있습니다 : P – d11wtq

+0

데이터 구조가 JSON 형식으로 작성되었으므로 데이터가 들어오는 곳이되었지만 ' ActiveSupport :: JSON'을 레일즈에서 가져 왔습니다. – d11wtq

+0

작은 변이를 사용하여 Facets : hash.mash {| k, v | [v [ "key"], v [ "notice"]]} – tokland

2

이것은 유효한 Ruby 해시가 아닙니다. 그러나이 있다는 가정을 제공 (또는 하나에 그것을 구문 분석 것)와 키가 항상 "blog_namespace" 될 것으로, 다음과 같은 작업을 수행 할 수 있습니다

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

해시에 하나 이상의 항목이 있다는 것을 분명히 밝혀 줘야합니다 ... blog_namespace는 많은 네임 스페이스 중 하나였습니다. 하지만 고마워 :) (데이터가 JSON에서 Ruby 해시로 변환 됨). – d11wtq