2014-09-18 5 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 [: type]]} .values.map (&: first) '. –

ответ

13

Попробуйте использовать Array#values_at, чтобы сгенерировать массив до uniq.

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

Просто крошечная коррекция: 'uniq' передает каждое значение блоку, так что на самом деле это« Хэш »в этом случае, и он будет вызывать [' Hash # values_at'] (http://ruby-doc.org /core/Hash.html#method-i-values_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}] 
Смежные вопросы