2014-09-18 3 views
6

내가 다시 스포츠 및 유형 조합에 따라 해시의 배열을 좀하고 싶습니다루비, 여러 필드를 기반으로 배열의 고유 한 해시

나는 다음과 같은 배열을 가지고 :

[ 
    { sport: "football", type: 11, other_key: 5 }, 
    { sport: "football", type: 12, othey_key: 100 }, 
    { sport: "football", type: 11, othey_key: 700 }, 
    { sport: "basketball", type: 11, othey_key: 200 }, 
    { sport: "basketball", type: 11, othey_key: 500 } 
] 

I을 '돌아 가야하고 싶습니다 :

[ 
    { sport: "football", type: 11, other_key: 5 }, 
    { sport: "football", type: 12, othey_key: 100 }, 
    { sport: "basketball", type: 11, othey_key: 200 }, 
] 

내가 사용하려고 (의사를)

[{}, {}, {}].uniq { |m| m.sport and m.type } 

루프를 사용하여 배열을 만들 수 있다는 것을 알고 있습니다. 루비를 처음 접했고 더 좋은 (더 우아한) 방법이 있다면 궁금합니다.

+0

예, '블록으로 uniq'가 갈 수있는 방법이지만, 여기에 또 다른 방법 :'arr.group_by {| H | [h [: sport], h [: type]]} .values.map (& : first)'. –

답변

13

Array#values_at을 사용하여 uniq에 대한 배열을 생성 해 봅니다.

sports.uniq{ |s| s.values_at(:sport, :type) } 
+1

작은 보정 :'uniq'가 각 값을 블록에 전달하고 있기 때문에, 실제로이 경우에는'Hash'이고,''Hash # values_at' (http://ruby-doc.org)를 호출 할 것입니다. /core/Hash.html#method-ivalues_at). 해시 나 배열이 아닌 다른 배열을 가지고 있다면 조심하십시오. –

5

하나의 솔루션과 같이, 스포츠 및 유형과 어떤 다른 종류의 키를 구축하는 것입니다 :

arr.uniq{ |m| "#{m[:sport]}-#{m[:type]}" } 

방법 uniq 작품이 요소를 비교하는 블록의 반환 값을 사용한다는 것입니다.

4
require 'pp' 

data = [ 
    { sport: "football", type: 11, other_key: 5 }, 
    { sport: "football", type: 12, othey_key: 100 }, 
    { sport: "football", type: 11, othey_key: 700 }, 
    { sport: "basketball", type: 11, othey_key: 200 }, 
    { sport: "basketball", type: 11, othey_key: 500 } 
] 

results = data.uniq do |hash| 
    [hash[:sport], hash[:type]] 
end 

pp results 

--output:-- 
[{:sport=>"football", :type=>11, :other_key=>5}, 
{:sport=>"football", :type=>12, :othey_key=>100}, 
{:sport=>"basketball", :type=>11, :othey_key=>200}] 
관련 문제