2014-09-18 11 views
6

geri spor ve tip kombinasyonuna dayalı karma bir dizi almak istiyorumYakut, birden çok alanda dayalı dizide benzersiz karmaları

aşağıdaki dizisi var:

[ 
    { 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 } 
] 

ben 'geri almak istiyorum:

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

ben kullanmaya çalıştı (pseudocode):

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

Döngülerle böyle bir dizi oluşturabileceğimi biliyorum, yakut için oldukça yeni ve bunu yapmak için daha iyi (daha zarif) bir yol varsa merak ediyorum.

+0

Evet, 'bir blok ile uniq' gitmek yoldur, ama burada başka bir yol:' arr.group_by {| h | [h [: spor], h [: tür]]} .values.map (&: ilk) '. –

cevap

13

uniq için bir dizi oluşturmak için Array#values_at kullanmayı deneyin.

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

Sadece küçük bir düzeltme: 'uniq' her bir değer bloğa geçiyor, yani bu aslında bir "Hash" ve bu durumda ['Hash # values_at'] (http://ruby-doc.org) /core/Hash.html#method-i-values_at). Sadece karmaşıklar veya diziler dışında bir dizi şey varsa dikkatli olun. –

5

bir çözüm şöyle, spor ve türü ile anahtarın çeşit inşa etmektir:

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

yolu uniq eserler o unsurları karşılaştırmak için bloğun dönüş değerini kullanır.

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}] 
İlgili konular