2016-06-06 3 views
-8

나는 배열 레일/루비 만들어주는 새로운 해시

arr = [ 
['category','subcat','detail'],['category1','subcat1','detail1'] 
] 

의 배열이 나는 그것이 {'category'=>'category','subcat'=>'subcat','detail'=>'detail'}...,other hashes from array

hash={} 

내가 뭘하는지에서 해시를 만들고 싶어 것이

arr.each{|el| 
hash['category'] = el[0]; 
hash['subcat'] = el[1]; 
hash['detail'] = h[2]; 
} 

하지만 마지막 요소 만 반환합니다.

hash=>{category:'category1',subcat:'subcat1',detail:'detail1'}

내가 기존의 해시 키와 함께 할

는 완벽하게 작동하지만, 난 새 키 맞아요, 작업을 설정하려고하면

를 해결하는 방법 ?

+0

예제 코드를 수정하십시오. 작동하지 않습니다. (BTW,': category'는''category "'와 동일하지 않습니다.) – Stefan

+0

'arr'에 항상 정확하게 두 개의 서브 배열이 있습니까? –

+0

@ Jordan, 많은 배열이있을 수 있습니다 – user

답변

2

Array#transpose (조합 번호 : Array#to_h)을 사용할 수 있습니다. 해시의 키는 문자열이 다음 경우 당신은 상관하지 않으면 당신은 간단하게 수행 할 수 있습니다

: 당신이 다음 문자로 키가 필요한 경우

arr.transpose.to_h # => {"category"=>"category1", "subcat"=>"subcat1", "detail"=>"detail1"} 

당신은 좀 더 많은 작업을 수행해야합니다

arr.transpose.to_h.inject({}){|hash, (k,v)| hash[k.to_sym] = v; hash } 
3

해시는 고유 키만 가질 수 있으며 복제는 허용되지 않습니다. 이에

묵상 : 당신이 복제를 삽입 할 때 동일한 이름을 가진 기존의 키를 덮어

foo = {} # => {} 
foo['a'] = 1 
foo # => {"a"=>1} 

foo 이제 하나의 키/값 쌍의 해시입니다.

foo['a'] = 2 
foo # => {"a"=>2} 

이 본질적으로 당신이 무슨 일을하는지 :

arr.each{|el| 
    hash['category'] = el[0]; 
    hash['subcat'] = el[1]; 
    hash['detail'] = h[2]; 
} 
나는 단지 이전 값을 덮어 동일한 키를 사용하여 다른 요소를 추가하려고하면, 나는 또 다른 키/값 쌍을 추가하지 마십시오

코드를 작동 시키려면 루프를 통해 반복 할 때마다 키에 대해 다른 이름을 찾아야합니다.

그래도 난 다른 키/값을 추가 할 수 있습니다

foo['b'] = 3 
foo # => {"a"=>2, "b"=>3} 

the documentation 이상의 정보에 대한 루비 해시 자습서를 참조하십시오.