2012-05-22 2 views
-1

문자열과 해시간에 요소가 교체되는 루비 배열이 있습니다. 예 :중첩 해시에 대한 Ruby 혼합 배열

["1234", Hash#1, "5678", Hash#2] 

이 중첩 해시 구조를 만들고 싶습니다. 따라서

hash["1234"]["key in hash#1"] = value 
hash["5678"]["key in hash#2"] = value 

아무에게도/지금이 작업을 수행하는 좋은 방법이 있습니까? 고맙습니다.

+2

여기에서 원하는 내용이 완전히 명확하지 않습니다. 배열에서 두 번째 요소 (해시이어야 함)를 가져 와서 배열의 이전 항목을 사용하여 원래 해시의 기존 키를 기반으로 만드는 해시 값을 사용하여 키를 만들고 싶습니까? 정렬)? – coreyward

+1

해시에 둘 이상의 키/값이있을 수 있습니다. 어디로 갈까요? 예제에서 유효한 Ruby를 사용하십시오. 1)이 배열 (실제 배열)을 가지고 있고 2)이 결과를 원한다면 3) 그게 지금까지 해봤습니다. – tokland

+1

나는 그것이 명확하지 않기 때문에 당신의 질문을 downvoted했습니다. 실제 데이터가 어떤 모습으로 보이고 그 데이터로 무엇을 만들고 싶은지 명확히하기 위해 질문을 편집하면 기꺼이 내 투표를 취소 할 것입니다. – Phrogz

답변

5

는 단순히 한 번에 두 슬라이스와 해시로 변환합니다

hsh = Hash[*arr] #suppose arr is the array you have 

를 사용합니다.

+1

당신은'Hash [* arr]'이 필요합니다. – Phrogz

+0

@Phrogz 네, 맞습니다 :) – texasbruce

2

배열에이 작업을 직접 수행하는 방법이 없다고 생각합니다. 다음 코드는 작동하며 읽기가 쉽습니다.

hsh = {} 

ary.each_slice(2) do |a, b| 
    hsh[a] = b 
end 

# Now `hsh` is as you want it to be 
+0

Simpler :'hsh = 해쉬 [ary.each_slice (2) .to_a]'(내 대답 참조). – Phrogz

1

당신이 원하는 무엇을 추측은 이후 "해시 # 1 키는"전혀 분명하지 않으며, 사용자가 정의한 것을 hash 또는 value가 있어야한다 : 아마 또는

value = 42 

h1 = {a:1} 
h2 = {b:2} 
a = ["1234",h1,"5678",h2] 
a.each_slice(2).each{ |str,h| h[str] = value } 
p h1, #=> {:a=>1, "1234"=>42} 
    h2 #=> {:b=>2, "5678"=>42} 

, 그냥 재미 측면을 사용하여,

h1 = {a:1} 
h2 = {b:2} 
a = ["1234",h1,"5678",h2] 

hash = Hash[ a.each_slice(2).to_a ] 
p hash    #=> {"1234"=>{:a=>1}, "5678"=>{:b=>2}} 
p hash["1234"][:a] #=> 1 
1

하자 추측 : 당신이 의미

,
require 'facets' 
xs = ["1234", {:a => 1, :b => 2}, "5678", {:c => 3}] 
xs.each_slice(2).mash.to_h 
#=> {"1234"=>{:a=>1, :b=>2}, "5678"=>{:c=>3}} 
+0

ksol의 ​​답변 (덜 효과적인 형태로)과 나의 대답 (직접적으로)으로 이미 설명했습니다. – Phrogz

+1

@Phrogz : 새로운 것을 보여주기 위해면으로 변경되었습니다. – tokland

+0

글쎄, 최선의 대답을 만들기 위해 다른 대답에서 그림을 그리는 데는 아무 문제가 없습니다. (특히 해시 ([Hash]) 버전을 대답에 추가해야한다고 말하고 있는데, 특히 받아 들여지는 경우에.) 이전에는 대답이 중복되었지만 이제는 +1 할 수 있습니다. – Phrogz