2012-04-30 3 views
0

샘플 해시 값 :키 배열에 의해 중첩 된 해시 키 값을 얻기는

{ 
    "audio" => { 
     "audio/aac" => ["aac"], 
     "audio/mpeg" => ["mp3", "mp2"], 
     "audio/mp4" => ["m4a", "m4b", "m4r", "3gp"], 
     "audio/ogg" => ["ogg", "oga"], 
     "audio/flac" => ["flac"], 
     "audio/speex" => ["spx"], 
     "audio/x-ms-wma" => ["wma"], 
     "audio/x-pn-realaudio" => ["rm", "ram"], 
     "audio/vnd.wave" => ["wav"], 
     "audio/x-musepack" => ["mpc", "mp+", "mpp"], 
     "audio/x-aiff" => ["aiff", "aif", "aifc"], 
     "audio/x-tta" => ["tta"] 
    }, 
    "video" => { 
     "video/mp4" => ["mp4"], 
     "video/mpeg" => ["mpg", "mpeg"], 
     "video/x-m4v" => ["m4v"], 
     "video/quicktime" => ["mov"], 
     "video/x-msvideo" => ["avi"], 
     "video/x-flv" => ["flv"], 
     "video/webm" => ["webm"] 
    } 
    } 

무엇입니까 (첫 경기는 괜찮습니다) 관련 콘텐츠 형식을 얻을 수있는 파일 확장자를 주어진 가장 좋은 방법은?

"flac"을 검색하면 "audio/flac"이 반환됩니다. 현재 내가 이것을 사용하고

:

당신은 이미 당신이 가지고있는 데이터 구조가 원하는 방식으로 검색하는 끔찍한 깨달았다으로
hsh.each_key do |group| 
    hsh[group].each do |k,v| 
    return k if v.include?(extension) 
    end 
end 

답변

4

구조체를 만들 때 가장 잘 수행됩니다. 그러나 다양한 레벨을 반복하면서 유용한 레벨을 얻을 수 있습니다. 내가 mime_hash에 초기 해시를 지정하면 내가 사용하여 해명 할 수 있습니다 더 자세하게

Hash[*mime_hash.map{ |av, types| types.map{ |mime_type, extensions| extensions.product([mime_type]) } }.flatten] 

또는 :

Hash[ 
    *mime_hash.map{ |av, types| 
    types.map{ |mime_type, extensions| 
     extensions.product([mime_type]) 
    } 
    }.flatten 
] 

가 반환하는 :

{ 
    "aac" => "audio/aac", 
    "mp3" => "audio/mpeg", 
    "mp2" => "audio/mpeg", 
    "m4a" => "audio/mp4", 
    "m4b" => "audio/mp4", 
    "m4r" => "audio/mp4", 
    "3gp" => "audio/mp4", 
    "ogg" => "audio/ogg", 
    "oga" => "audio/ogg", 
    "flac" => "audio/flac", 
    "spx" => "audio/speex", 
    "wma" => "audio/x-ms-wma", 
     "rm" => "audio/x-pn-realaudio", 
    "ram" => "audio/x-pn-realaudio", 
    "wav" => "audio/vnd.wave", 
    "mpc" => "audio/x-musepack", 
    "mp+" => "audio/x-musepack", 
    "mpp" => "audio/x-musepack", 
    "aiff" => "audio/x-aiff", 
    "aif" => "audio/x-aiff", 
    "aifc" => "audio/x-aiff", 
    "tta" => "audio/x-tta", 
    "mp4" => "video/mp4", 
    "mpg" => "video/mpeg", 
    "mpeg" => "video/mpeg", 
    "m4v" => "video/x-m4v", 
    "mov" => "video/quicktime", 
    "avi" => "video/x-msvideo", 
    "flv" => "video/x-flv", 
    "webm" => "video/webm" 
} 
+0

Nice,'Array # product'에 대해 몰랐습니다. –

+0

지도 + 평면 (1) = 평면 _지도. 해시 [...]는 쌍을 이루고 전체를 평평하게 할 필요가 없습니다. – tokland

0

. 동일한 데이터를 계속해서 검색하려고한다고 가정 할 때 인덱스를 작성해야합니다.

이렇게하는 데는 여러 가지 방법이 있지만 가장 간단한 방법은 해시를 평평하게하고 반전시켜 키가 값이되고 그 반대가되도록하는 것입니다. 당신은 단순히 content_types['flac']

를 호출하여 검색 할 수 있습니다 그 방법은 예를 해시의 섹션은 다음과 같이 끝날 수 있습니다

{ 
    "aac" => "audio/aac", 
    "mp3" => "audio/mpeg", 
    "mp2" => "audio/mpeg", 
    "m4a" => "audio/mp4", 
    "m4b" => "audio/mp4", 
    "m4r" => "audio/mp4", 
    "3gp" => "audio/mp4", 
    "flac" => "audio/flac" 
} 
+0

예, 구조가 적합하지 않습니다, 주로 응용 프로그램의 다른 목적 (오디오/비디오 그룹)에 사용되며 ext를 사용하여 MIME 형식 확인을 요청하지 않았습니다. – kain

0

사용해보십시오 rassoc()

정의 : 해시를 통해

검색 ==를 사용하여 obj를 값과 비교합니다. 일치하는 첫 번째 키 - 값 쌍 (두 요소 배열)을 반환합니다. 또한 Array # rassoc을 참조하십시오.

a = {1=> "one", 2 => "two", 3 => "three", "ii" => "two"} 
a.rassoc("two") #=> [2, "two"] 
a.rassoc("four") #=> nil 
+0

나는 이런 종류의 해시에서 예상대로 작동하지 않을까 걱정됩니다. 키가 배열 인 경우'hash [ "audio"]. rassoc ([ "m4b"])'는 아무 것도 반환하지 않기 때문에 문제가됩니다. 모범이 있습니까? – kain