2012-02-03 7 views
1

나는 많은 게시물을 읽었지만 아무도이 일을하지 않는 것으로 보인다. 다소 까다 롭다.해시 배열을 루비에 배열로 포함하는 해시

배열의 값 중 하나로 배열을 포함하는 해시가 있다고 가정 해보십시오. 다음과 같이

hash = { 
    :a => 'one', 
    :arr => [ 
    {:id => 'ten', :amount => 10, :b => 'two'}, 
    {:id => 'twenty', :amount => 20, :b => 'two'}, 
    {:id => 'apple', :amount => 7, :b => 'applesauce'} 
    ], 
    :c => 3 
} 

나는, (포함 된 배열의 크기의 것) 해시의 배열이를 변환 할 :

변환이/값 쌍은 어떤 키 유지해야
# => [ 
    {:a => 'one', :id => 'ten', :amount => 10, :b => 'two',  :c => 3}, 
    {:a => 'one', :id => 'twenty', :amount => 20, :b => 'two',  :c => 3}, 
    {:a => 'one', :id => 'apple', :amount => 7, :b => 'applesauce', :c => 3} 
] 

flatten_hash_array(hash, :arr) 

내가 Array 클래스의 루비 flatten이 아닌 어떤 것을 실현 : 내부 및 배열 외부 이상적으로 나는이 작업을 수행 물어 배열의 키를 전달할 수 우리가 필요해. 동사를 움켜 잡는다! 어떤 도움을 주시면 감사하겠습니다.

답변

5

유효성 검사를 제외하고 작업을 수행해야합니다.

def flatten_hash_array(hash, key) 
    hash[key].map {|entry| entry.merge(hash.reject {|k| k == key})} 
end 
+0

굉장! hash.reject 블록은 k, v를 전달하면되고, 매력처럼 작동합니다. 감사! def flatten_hash_array (해시, 키) 해시 [키] .map {| 항목 | end – adamrneary

+0

흠, 1.8/1.9의 차이가 있어야합니다. 루비는'hash.reject {| k |}'를 허용합니다. 두 개의 매개 변수를 사용할 수 있습니다. 그러나 헤이 - 그것이 당신을 위해 일하기 때문에 기쁘다. – Chowlett