2012-03-13 5 views
2

У меня есть массив хэш:Удалить подобные объекты из массива

[{ item_id: 1, relationship_1: 1, relationship_2: 1, value: 'go' }, 
{ item_id: 2, relationship_1: 2, relationship_2: 2, value: 'stop' }, 
{ item_id: 3, relationship_1: 2, relationship_2: 1, value: 'stop' }, #remove 
{ item_id: 4, relationship_1: 3, relationship_2: 1, value: 'go' }, 
{ item_id: 5, relationship_1: 1, relationship_2: 2, value: 'go' }] #remove 

Я хочу линию комментируемой быть удалено. Необходимо удалить все линии, имеющие relationship_1 и value. Единственный способ, которым я могу думать, это:

items.each do |i| 
    items.each do |k| 
    if i.item_id != k.item_id and i.relationship_1 == k.relationship_1 and i.value == k.value 
     items.remove(k) 
    end 
    end 
end 

Это не работает должным образом. Какой самый «рубиновый» способ удалить эти оскорбительные элементы?

+0

Как вы определяете "похожие"? Также читайте о [разнице между '&&'/'||' & 'и'/'или' в Ruby] (http://devblog.avdi.org/2010/08/02/using-and-and- или-в-рубиновый /). Они не одинаковы. –

+0

В этом случае я имею в виду, что, имея определенный набор значений, которые равны, на самом деле не было лучшего способа сформулировать его в названии. –

ответ

3

К сожалению, uniq_by не доступна в ядре Ruby. Потяните его с помощью require 'activesupport'.

items.uniq_by {|h| [h[:replationship_1], h[:value]] } 

Редактировать: Как было отмечено @mu ниже, Ruby 1.9 в uniq также работает:

items.uniq{|h| [h[:replationship_1], h[:value]] } 
+0

К счастью, я использую Rails 3. Мне не нужны дополнительные требования, если они им не нужны. Поскольку эти объекты являются объектами ActiveResource, это будет отлично работать. Спасибо. –

+1

[Реализация 'uniq_by'] (https://github.com/rails/rails/blob/7194b393a611727fb36e8f586910e75db1bae746/activesupport/lib/active_support/core_ext/array/uniq_by.rb#L6) (я думаю) на самом деле довольно умный и заслуживает осмотра. –

+3

Глупости, своего рода. 1.9 ['Array # uniq'] (http://ruby-doc.org/core-1.9.3/Array.html#method-i-uniq) может принимать блок, а' Array # uniq', безусловно, находится в ядро. –

3

group_by{ |item| [item.relationship_1, item.value] }.values.map(&:first)?

UPDATE

К сожалению, это был хэш:

group_by{ |item| [item[:relationship_1], item[:value]] }.values.map(&:first)

или

group_by{ |item| item.values_at(:relationship_1, :value) }.values.map(&:first)

+0

Почему 'item.relationship_1' dosen't работает на моем ruby ​​1.9.2 install? Я должен заставить 'item [: relationship_1]' работать. –

1

Может this функция поможет. Я нашел это в этом thread, и если я не ошибаюсь, он является частью последнего рубина на рельсах.

a.uniq_by {|t| [t.replationship_1, t.value]}