2012-10-12 12 views
2

에 값을 취득 나는루비 루비

res = [[0, :product, "client"], [0, :os, "windows"], [0, :architecture, "32rs"]] 

내가 운영 체제의 가치를 할 수 있습니다. 나는 res [1] [2]에 의해 그것을 할 수는 있지만 인덱스가 변할 수 있기 때문에 인덱스에 의존하기를 원하지 않습니다. 내가 가지고있는 것, 즉 핵심 : os, 그래서 그것을 찾는 가장 좋은 방법은 무엇입니까?

res.select{|h| h.include?(:os)}.map(&:last) 

을하지만 데이터가 더 나은 해시로 표현되는 것을 나에게 보인다는 데이터가 구성되는 방식을 변경할 수 없습니다 가정

+4

배열 인덱스를 사용하지 않으려면이 데이터를 실제로 해시로 구성해야합니다. – pje

답변

5

, 당신이 뭔가를 할 수 있습니다.

res_hash = res.each_with_object({}) do |value, memo| 
    memo[value[1]] = value[2] 
end 
# => {:product=>"client", :os=>"windows", :architecture=>"32rs"} 

그럼 당신은 다음과 같은 개별 데이터 속성에 액세스 할 수 있습니다 :

res_hash[:os] 
# => "windows" 
+0

해시를 만들기 위해 주사 대신 해시 []를 사용할 수 있습니다. – tokland

+0

감사합니다. 나는 처음에 그것을 바꾸고 싶지 않았다. 그러나 나중에 나는 당신과 @ Boris 주석을 읽은 후 해쉬로 변환하기로 결정했다. 그런데 중첩 된 배열이 있으면 어떻게됩니까? 0, : 아키텍처, "32rs"], [0, : 주소, [0, : 링크, "XwjmnS] "]] 이제 링크의 가치를 얻고 싶습니까? – JVK

4
hash = Hash[res.map{ |a| a[1..-1] }] 
hash[:os] # windows 
+0

+1, '[]'의 패딩 공간이 내 눈을 심각하게 해치지 만 – tokland

+0

와우는 너무 깔끔함 :) – JVK

+0

@JVK : 주입을 사용하는 것보다 더 관용적입니다. – tokland

0

을 @pje는 가정하에 대답하는 동안 데이터를 변경할 수 없습니다, 나는 그의 제안에 조금 정교한 것

res = [ [0, product: "client"], 
     [0, os: "windows"], 
     [0, architecture: "32rs"] ] 
콤마 존재 대장 위치

사소한 변화 루비 컴파일러가 :에 해쉬 데이터를 구조화 마지막 요소에 대한 해시를 가진 것으로 [] 식을 구문 분석 : 당신이 걱정하는 경우가

res[1][1][:os] 

로 편안하게 필요한

[ [0, {product: "client}], [0, {os: "windows"}], [0, architecture: "32rs"] ] 

그런 다음 당신이 해결할 수있는 두 번째 수준의 배열의 순서는 것 변경하면 데이터를 더 깊이 재구성해야합니다 (예 :

res = { product: [ 0, "client" ], os: [ 0, "windows" ], architecture: [ 0, "32rs" ] ] 

).

+0

감사합니다. 보리스는 콜론과 쉼표의 변경이 그 차이를 만들어라. 오늘 새로운 무언가를 배우는 것을 기쁘게 생각하십시오 :) – JVK

+0

저것은 아주 저조하게 문서화됩니다. –